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

Artifact 750ed16649d655fef117c6d983c7382acd625bfd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
2f80: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  p==TK_SELECT.   
2f90: 20 20 7c 7c 20 28 70 56 65 63 74 6f 72 2d 3e 6f    || (pVector->o
2fa0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
2fb0: 26 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d  & pVector->op2==
2fc0: 54 4b 5f 53 45 4c 45 43 54 29 0a 20 20 20 20 29  TK_SELECT).    )
2fd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
2fe0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
2ff0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
3000: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
3010: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3020: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3030: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3040: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3050: 70 56 65 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69  pVector;.}.#endi
3060: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
3070: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3080: 52 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  RY) */..#ifndef 
3090: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
30a0: 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  UERY./*.** Compu
30b0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
30c0: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
30d0: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
30e0: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
30f0: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3100: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3110: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
3120: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
3130: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
3140: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
3150: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
3160: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
3170: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3180: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3190: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
31a0: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
31b0: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
31c0: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
31d0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
31e0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
31f0: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3200: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3210: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
3220: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
3230: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
3240: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
3250: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
3260: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
3270: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3280: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3290: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32a0: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
32b0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 20 6f  en the returne o
32c0: 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65 72  bject will refer
32d0: 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e 64  ence pVector and
32e0: 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73 74   so pVector must
32f0: 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64   remain.** valid
3300: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f 66   for the life of
3310: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
3320: 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74 6f  ject.  If pVecto
3330: 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52  r is a TK_VECTOR
3340: 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72 20  .** or a scalar 
3350: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
3360: 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65 74   it can be delet
3370: 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  ed as soon as th
3380: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
3390: 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  turns..**.** A t
33a0: 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61 20  rick to cause a 
33b0: 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74 6f  TK_SELECT pVecto
33c0: 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  r to be deleted 
33d0: 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a  together with.**
33e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45 78   the returned Ex
33f0: 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f 20  pr object is to 
3400: 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63 74  attach the pVect
3410: 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68 74  or to the pRight
3420: 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65   field.** of the
3430: 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c   returned TK_SEL
3440: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3450: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20  object..*/.Expr 
3460: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56  *sqlite3ExprForV
3470: 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50 61  ectorField(.  Pa
3480: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3490: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
34a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
34b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
34c0: 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20 20  /* The vector.  
34d0: 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  List of expressi
34e0: 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45 4c  ons or a sub-SEL
34f0: 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ECT */.  int iFi
3500: 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eld           /*
3510: 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   Which column of
3520: 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20 72   the vector to r
3530: 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  eturn */.){.  Ex
3540: 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  pr *pRet;.  if( 
3550: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3560: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73  SELECT ){.    as
3570: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 66  sert( pVector->f
3580: 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
3590: 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ect );.    /* Th
35a0: 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
35b0: 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20  MN Expr node:.  
35c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66    **.    ** pLef
35d0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56 65  t:           pVe
35e0: 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ctor containing 
35f0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  TK_SELECT.    **
3600: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
3610: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
3620: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
3630: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
3640: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
3650: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
3660: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3670: 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a  * pLeft->iTable:
3680: 20 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61     First in an a
3690: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
36a0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c   holding result,
36b0: 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20   or 0.    **    
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
36d0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
36e0: 6f 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e  ot yet computed.
36f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
3700: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3710: 28 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20  () specifically 
3720: 73 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73  skips the recurs
3730: 69 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20  ive delete of.  
3740: 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b    ** pLeft on TK
3750: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3760: 6f 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68  odes.  But pRigh
3770: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73  t is followed, s
3780: 6f 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a  o pVector.    **
3790: 20 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64   can be attached
37a0: 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61   to pRight to ca
37b0: 75 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f  use this node to
37c0: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
37d0: 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f  of.    ** pVecto
37e0: 72 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68  r.  Typically th
37f0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74  ere will be mult
3800: 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  iple TK_SELECT_C
3810: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20  OLUMN nodes.    
3820: 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
3830: 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74   pLeft pointer t
3840: 6f 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62  o the pVector, b
3850: 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74  ut only one of t
3860: 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  hem.    ** will 
3870: 6f 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e  own the pVector.
3880: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74  .    */.    pRet
3890: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
38a0: 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
38b0: 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20  T_COLUMN, 0, 0, 
38c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  0);.    if( pRet
38d0: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   ){.      pRet->
38e0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64  iColumn = iField
38f0: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 4c  ;.      pRet->pL
3900: 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20  eft = pVector;. 
3910: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3920: 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74   pRet==0 || pRet
3930: 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  ->iTable==0 );. 
3940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3950: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3960: 56 45 43 54 4f 52 20 29 20 70 56 65 63 74 6f 72  VECTOR ) pVector
3970: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
3980: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
3990: 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74 20 3d  Expr;.    pRet =
39a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
39b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 65 63  pParse->db, pVec
39c0: 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tor, 0);.  }.  r
39d0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
39e0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 28  ndif /* !define(
39f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3a00: 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UERY) */../*.** 
3a10: 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
3a20: 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  xpr is of type T
3a30: 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  K_SELECT, genera
3a40: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
3a50: 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72  ate.** it. Retur
3a60: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  n the register i
3a70: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
3a80: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72  lt is stored (or
3a90: 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  , if the .** sub
3aa0: 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
3ab0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
3ac0: 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20  lumn, the first 
3ad0: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f  in an array.** o
3ae0: 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77  f registers in w
3af0: 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  hich the result 
3b00: 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a  is stored)..**.*
3b10: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f  * If pExpr is no
3b20: 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78  t a TK_SELECT ex
3b30: 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e  pression, return
3b40: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3b50: 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  t exprCodeSubsel
3b60: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
3b70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
3b80: 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a  .  int reg = 0;.
3b90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3ba0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
3bb0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
3bc0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3bd0: 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
3be0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
3bf0: 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
3c00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
3c10: 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn reg;.}../*.*
3c20: 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74  * Argument pVect
3c30: 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  or points to a v
3c40: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3c50: 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56   - either a TK_V
3c60: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53  ECTOR.** or TK_S
3c70: 45 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72  ELECT that retur
3c80: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
3c90: 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75   column. This fu
3ca0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
3cb0: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  * the register n
3cc0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73  umber of a regis
3cd0: 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ter that contain
3ce0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  s the value of.*
3cf0: 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64  * element iField
3d00: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a   of the vector..
3d10: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
3d20: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20   is a TK_SELECT 
3d30: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
3d40: 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73   code for it mus
3d50: 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61  t have .** alrea
3d60: 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  dy been generate
3d70: 64 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72  d using the expr
3d80: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20  CodeSubselect() 
3d90: 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73  routine. In this
3da0: 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74  .** case paramet
3db0: 65 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f  er regSelect sho
3dc0: 75 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74  uld be the first
3dd0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
3de0: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e  registers.** con
3df0: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  taining the resu
3e00: 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73  lts of the sub-s
3e10: 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  elect. .**.** If
3e20: 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74   pVector is of t
3e30: 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74  ype TK_VECTOR, t
3e40: 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65  hen code for the
3e50: 20 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64   requested field
3e60: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
3e70: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  . In this case (
3e80: 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62  *pRegFree) may b
3e90: 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  e set to the num
3ea0: 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ber of.** a temp
3eb0: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
3ec0: 6f 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  o be freed by th
3ed0: 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20  e caller before 
3ee0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
3ef0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3f00: 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  g, output parame
3f10: 74 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73  ter (*ppExpr) is
3f20: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
3f30: 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a   the.** Expr obj
3f40: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3f50: 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c  g to element iEl
3f60: 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  em of the vector
3f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3f80: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
3f90: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3fa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3fb0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
3fc0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3fd0: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
3ff0: 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74  ector to extract
4000: 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f   element from */
4010: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20  .  int iField,  
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65     /* Field to e
4040: 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63  xtract from pVec
4050: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tor */.  int reg
4060: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20  Select,         
4070: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4080: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  t in array of re
4090: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70  gisters */.  Exp
40a0: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20  OUT: Expression 
40d0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
40e0: 20 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20   *pRegFree      
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4100: 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74  OUT: Temp regist
4110: 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b  er to free */.){
4120: 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74  .  u8 op = pVect
4130: 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74  or->op;.  assert
4140: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
4150: 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  || op==TK_SELECT
4160: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   || op==TK_REGIS
4170: 54 45 52 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  TER );.  if( op=
4180: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
4190: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71      *ppExpr = sq
41a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
41b0: 53 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c  Subexpr(pVector,
41c0: 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65   iField);.    re
41d0: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54  turn pVector->iT
41e0: 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d  able+iField;.  }
41f0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
4200: 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45  LECT ){.    *ppE
4210: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4220: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
4230: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4240: 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72  r;.     return r
4250: 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b  egSelect+iField;
4260: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
4270: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73   pVector->x.pLis
4280: 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  t->a[iField].pEx
4290: 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  pr;.  return sql
42a0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
42b0: 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72  (pParse, *ppExpr
42c0: 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a  , pRegFree);.}..
42d0: 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
42e0: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
42f0: 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74  arison between t
4300: 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73  wo vector values
4310: 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  . Compute.** the
4320: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63   result of the c
4330: 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c  omparison (1, 0,
4340: 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72   or NULL) and wr
4350: 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  ite that.** resu
4360: 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  lt into register
4370: 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   dest..**.** The
4380: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74   caller must sat
4390: 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  isfy the followi
43a0: 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73  ng preconditions
43b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45  :.**.**    if pE
43c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20  xpr->op==TK_IS: 
43d0: 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61       op==TK_EQ a
43e0: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
43f0: 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45  LLEQ.**    if pE
4400: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4410: 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61  T:   op==TK_NE a
4420: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
4430: 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72  LLEQ.**    other
4440: 77 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20  wise:           
4450: 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e       op==pExpr->
4460: 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a  op and p5==0.*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
4480: 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20  VectorCompare(. 
4490: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
44a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67         /* Code g
44b0: 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74  enerator context
44c0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
44d0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
44e0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
44f0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
4500: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20   dest,          
4510: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
4520: 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lts into this re
4530: 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f  gister */.  u8 o
4540: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4550: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
4560: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38  operator */.  u8
4570: 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20   p5             
4580: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
4590: 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a  LLEQ or zero */.
45a0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
45b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
45c0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
45d0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78  xpr->pLeft;.  Ex
45e0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
45f0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 0a 20 20 69  pr->pRight;..  i
4600: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
4610: 65 63 6b 43 6f 6d 70 61 72 69 73 6f 6e 28 70 50  eckComparison(pP
4620: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
4630: 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ght)==0 ){.    i
4640: 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74  nt nLeft = sqlit
4650: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
4660: 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  (pLeft);.    int
4670: 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4c   i;.    int regL
4680: 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  eft = 0;.    int
4690: 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a 20   regRight = 0;. 
46a0: 20 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a     u8 opx = op;.
46b0: 20 20 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65      int addrDone
46c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
46d0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
46e0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
46f0: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
4700: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20  pr->op==TK_NE . 
4710: 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
4720: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
4730: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
4740: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  OT .         || 
4750: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
4760: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4770: 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 20 20 7c  K_GT .         |
4780: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4790: 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  LE || pExpr->op=
47a0: 3d 54 4b 5f 47 45 20 0a 20 20 20 20 29 3b 0a 20  =TK_GE .    );. 
47b0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
47c0: 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78  ->op==op || (pEx
47d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26  pr->op==TK_IS &&
47e0: 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20   op==TK_EQ).    
47f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4810: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
4820: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4830: 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  5==0 || pExpr->o
4840: 70 21 3d 6f 70 20 29 3b 0a 20 20 20 20 61 73 73  p!=op );.    ass
4850: 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45 5f  ert( p5==SQLITE_
4860: 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72 2d  NULLEQ || pExpr-
4870: 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 20 20  >op==op );..    
4880: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f  p5 |= SQLITE_STO
4890: 52 45 50 32 3b 0a 20 20 20 20 69 66 28 20 6f 70  REP2;.    if( op
48a0: 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d  x==TK_LE ) opx =
48b0: 20 54 4b 5f 4c 54 3b 0a 20 20 20 20 69 66 28 20   TK_LT;.    if( 
48c0: 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78  opx==TK_GE ) opx
48d0: 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 20 20 72   = TK_GT;..    r
48e0: 65 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64  egLeft = exprCod
48f0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
4900: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 72  e, pLeft);.    r
4910: 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43 6f  egRight = exprCo
4920: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
4930: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20 20  se, pRight);..  
4940: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
4950: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
4960: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
4970: 20 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31      int regFree1
4980: 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d   = 0, regFree2 =
4990: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   0;.      Expr *
49a0: 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20  pL, *pR; .      
49b0: 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  int r1, r2;.    
49c0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
49d0: 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20  & i<nLeft );.   
49e0: 20 20 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c     if( i>0 ) sql
49f0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
4a00: 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
4a10: 20 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72   r1 = exprVector
4a20: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
4a30: 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65   pLeft, i, regLe
4a40: 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65  ft, &pL, &regFre
4a50: 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
4a60: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4a70: 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  er(pParse, pRigh
4a80: 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20  t, i, regRight, 
4a90: 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &pR, &regFree2);
4aa0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
4ab0: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4ac0: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4ad0: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 20  dest, p5);.     
4ae0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4af0: 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
4b00: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
4b10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4b20: 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); 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 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
4b50: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4b60: 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
4b70: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
4b80: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4b90: 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
4ba0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
4bb0: 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
4bc0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4bd0: 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
4be0: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
4bf0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4c00: 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
4c10: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
4c20: 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
4c30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4c40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4c50: 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
4c60: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c70: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c80: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 69  gFree2);.      i
4c90: 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33  f( i>0 ) sqlite3
4ca0: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
4cb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
4cc0: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
4cd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ce0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f     }.      if( o
4cf0: 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  px==TK_EQ ){.   
4d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
4d20: 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  ot, dest, addrDo
4d30: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
4d40: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35  e(v);.        p5
4d50: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
4d60: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
4d70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4d80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4d90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4da0: 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64  OP_If, dest, add
4db0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
4dc0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
4dd0: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
4de0: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  EPNULL;.      }e
4df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
4e00: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c  ert( op==TK_LT |
4e10: 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f  | op==TK_GT || o
4e20: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p==TK_LE || op==
4e30: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20  TK_GE );.       
4e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e50: 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74  p2(v, OP_ElseNot
4e60: 45 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29  Eq, 0, addrDone)
4e70: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
4e80: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4e90: 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20  TK_LT);.        
4ea0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4eb0: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
4ec0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4ed0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4ee0: 45 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  E);.        Vdbe
4ef0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4f00: 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20  ==TK_GE);.      
4f10: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
4f20: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
4f30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
4f40: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
4f50: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f  eLabel(v, addrDo
4f60: 6e 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  ne);.  }.}..#if 
4f70: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
4f80: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
4f90: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
4fa0: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
4fb0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
4fc0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
4fd0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
4fe0: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
4ff0: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
5000: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5010: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
5020: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5030: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
5040: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5050: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
5060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5070: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5080: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5090: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
50a0: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
50b0: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
50c0: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
50d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
50e0: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
50f0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
5100: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
5110: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
5120: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
5130: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5140: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5150: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
5160: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5170: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5180: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5190: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
51a0: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
51b0: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
51c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
51d0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
51e0: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
51f0: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5200: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
5210: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
5220: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
5230: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
5240: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
5250: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5260: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5270: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5280: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5290: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
52a0: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
52b0: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
52c0: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
52d0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
52e0: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
52f0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5300: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5310: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
5320: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
5330: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
5340: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
5350: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
5360: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5370: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5380: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5390: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
53a0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
53b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
53c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
53d0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
53e0: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
53f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
5400: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
5410: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
5420: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
5430: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
5440: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5450: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
5460: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5470: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
5480: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5490: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
54a0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
54b0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
54c0: 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65  OfExpr(p->pOffse
54d0: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
54e0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
54f0: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e  st(p->pEList, pn
5500: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5520: 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69  >pGroupBy, pnHei
5530: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5540: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  OfExprList(p->pO
5550: 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74  rderBy, pnHeight
5560: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  );.    heightOfS
5570: 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c  elect(p->pPrior,
5580: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   pnHeight);.  }.
5590: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
55a0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
55b0: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74  riable in the st
55c0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55d0: 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  s an .** argumen
55e0: 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  t. An expression
55f0: 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65   with no childre
5600: 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72  n, Expr.pList or
5610: 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63   .** Expr.pSelec
5620: 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68  t member has a h
5630: 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20  eight of 1. Any 
5640: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
5650: 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74  .** has a height
5660: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
5670: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5680: 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65  any other .** re
5690: 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c  ferenced Expr pl
56a0: 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  us one..**.** Al
56b0: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f  so propagate EP_
56c0: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
56d0: 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70  up from Expr.x.p
56e0: 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61  List to Expr.fla
56f0: 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70  gs,.** if approp
5700: 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
5710: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
5720: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
5730: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5740: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
5750: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
5760: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
5770: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5780: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
5790: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
57a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
57b0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
57c0: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
57d0: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
57e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78    }else if( p->x
57f0: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65  .pList ){.    he
5800: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5810: 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69  ->x.pList, &nHei
5820: 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  ght);.    p->fla
5830: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
5840: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
5850: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
5860: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  List);.  }.  p->
5870: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
5880: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
5890: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
58a0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
58b0: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
58c0: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
58d0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
58e0: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
58f0: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
5900: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
5910: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
5920: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
5930: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  arse..**.** Also
5940: 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   propagate all E
5950: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5960: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5970: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5980: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5990: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
59a0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
59b0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
59c0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
59d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
59e0: 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65  return;.  exprSe
59f0: 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71  tHeight(p);.  sq
5a00: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
5a10: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
5a20: 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a  nHeight);.}../*.
5a30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
5a40: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5a50: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
5a60: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
5a70: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
5a80: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5a90: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5aa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5ab0: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5ac0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5ad0: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5ae0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5af0: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5b00: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5b10: 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45  }.#else /* ABOVE
5b20: 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  :  Height enforc
5b30: 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20  ement enabled.  
5b40: 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e  BELOW: Height en
5b50: 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f  forcement off */
5b60: 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65  ./*.** Propagate
5b70: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
5b80: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
5b90: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
5ba0: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
5bb0: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
5bc0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
5bd0: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
5be0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
5bf0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78  .  if( p && p->x
5c00: 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48  .pList && !ExprH
5c10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5c20: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5c30: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5c40: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5c50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5c60: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5c70: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78    }.}.#define ex
5c80: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
5c90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5ca0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
5cb0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
5cc0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
5cd0: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
5ce0: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
5cf0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
5d00: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
5d10: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
5d20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
5d30: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
5d40: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
5d50: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
5d60: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
5d70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
5d80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5d90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
5da0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
5db0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
5dc0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
5dd0: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
5de0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
5df0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
5e00: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
5e10: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
5e20: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
5e30: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
5e40: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
5e50: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
5e60: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  g is performed. 
5e70: 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20   The deQuote.** 
5e80: 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
5e90: 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69  ored if pToken i
5ea0: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
5eb0: 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a   token does not.
5ec0: 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ** appear to be 
5ed0: 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20  quoted.  If the 
5ee0: 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74  quotes were of t
5ef0: 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64  he form "..." (d
5f00: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a  ouble-quotes).**
5f10: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c   then the EP_Dbl
5f20: 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73  Quoted flag is s
5f30: 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  et on the expres
5f40: 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sion node..**.**
5f50: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
5f60: 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  If op==TK_INTEGE
5f70: 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69  R and pToken poi
5f80: 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  nts to a string 
5f90: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74  that.** can be t
5fa0: 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61  ranslated into a
5fb0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
5fc0: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5fd0: 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64  is not.** stored
5fe0: 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49   in u.zToken.  I
5ff0: 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65  nstead, the inte
6000: 67 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72  ger values is wr
6010: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e  itten.** into u.
6020: 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45  iValue and the E
6030: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
6040: 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72  is set.  No extr
6050: 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20  a storage.** is 
6060: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
6070: 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65  d the integer te
6080: 78 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f  xt and the dequo
6090: 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72  te flag is ignor
60a0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
60b0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20  ite3ExprAlloc(. 
60c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
60d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
60e0: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
60f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
6100: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
6110: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
6120: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6130: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
6140: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
6150: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
6160: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
6170: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6180: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6190: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
61a0: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
61b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
61c0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
61d0: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
61e0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
61f0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6200: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
6210: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
6220: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
6230: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
6240: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
6250: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
6260: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
6270: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6280: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6290: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
62a0: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
62b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
62c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
62d0: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
62e0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
62f0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6300: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
6310: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
6320: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
6330: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6340: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6350: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
6360: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
6370: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6380: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
6390: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
63a0: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
63b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
63c0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
63d0: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
63e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
63f0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
6400: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
6410: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
6420: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
6430: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
6440: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
6450: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
6460: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
6470: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
6480: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
6490: 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75  e && sqlite3Isqu
64a0: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
64b0: 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  en[0]) ){.      
64c0: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
64d0: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29  zToken[0]=='"' )
64e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
64f0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
6500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6510: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
6520: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
6530: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6540: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
6550: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
6560: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
6570: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6580: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6590: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
65a0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
65b0: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
65c0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
65d0: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
65e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
65f0: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
6600: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
6610: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6620: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6630: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6640: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6650: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6660: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6670: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6680: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
66a0: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
66b0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
66c0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
66d0: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
66e0: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
66f0: 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69   = zToken ? sqli
6700: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b  te3Strlen30(zTok
6710: 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  en) : 0;.  retur
6720: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
6730: 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30  oc(db, op, &x, 0
6740: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  );.}../*.** Atta
6750: 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  ch subtrees pLef
6760: 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20  t and pRight to 
6770: 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52  the Expr node pR
6780: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52  oot..**.** If pR
6790: 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  oot==NULL that m
67a0: 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f  eans that a memo
67b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
67c0: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
67d0: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
67e0: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  e, delete the su
67f0: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6800: 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64   pRight..*/.void
6810: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
6820: 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71  chSubtrees(.  sq
6830: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70  lite3 *db,.  Exp
6840: 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72  r *pRoot,.  Expr
6850: 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20   *pLeft,.  Expr 
6860: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28  *pRight.){.  if(
6870: 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   pRoot==0 ){.   
6880: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
6890: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
68a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
68b0: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
68c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
68d0: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
68f0: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
6900: 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74     pRoot->pRight
6910: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
6920: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
6930: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
6940: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
6950: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
6960: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
6970: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
6980: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6990: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
69a0: 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  gate & pLeft->fl
69b0: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
69c0: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
69d0: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
69e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78  * Allocate an Ex
69f0: 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f  pr node which jo
6a00: 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  ins as many as t
6a10: 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a  wo subtrees..**.
6a20: 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  ** One or both o
6a30: 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63  f the subtrees c
6a40: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74  an be NULL.  Ret
6a50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6a60: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72   the new.** Expr
6a70: 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61   node.  Or, if a
6a80: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
6a90: 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e  rs, set pParse->
6aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6ab0: 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75  ,.** free the su
6ac0: 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72  btrees and retur
6ad0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20  n NULL..*/.Expr 
6ae0: 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20  *sqlite3PExpr(. 
6af0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6b10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6b20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
6b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6b40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6b50: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
6b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6b70: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
6b80: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
6b90: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6ba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
6bb0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6bc0: 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  n     /* Argumen
6bd0: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20  t token */.){.  
6be0: 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f  Expr *p;.  if( o
6bf0: 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61  p==TK_AND && pPa
6c00: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
6c10: 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61      /* Take adva
6c20: 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63  ntage of short-c
6c30: 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74  ircuit false opt
6c40: 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e  imization for AN
6c50: 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c  D */.    p = sql
6c60: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
6c70: 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70  se->db, pLeft, p
6c80: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
6c90: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6ca0: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
6cb0: 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47  ->db, op & TKFLG
6cc0: 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31  _MASK, pToken, 1
6cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ce0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
6cf0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
6d00: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
6d10: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
6d20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6d30: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
6d40: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
6d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
6d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
6d70: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
6d80: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
6d90: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
6da0: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
6db0: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
6dc0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
6dd0: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
6de0: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
6df0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
6e00: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
6e10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6e20: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
6e30: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
6e40: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
6e50: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
6e60: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
6e70: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
6e80: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
6e90: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
6ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6eb0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
6ec0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
6ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6ee0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
6ef0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6f00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
6f10: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
6f20: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
6f30: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
6f40: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6f50: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
6f60: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
6f70: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
6f80: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
6f90: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
6fa0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
6fb0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
6fc0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
6fd0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
6fe0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
6ff0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
7000: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
7010: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
7020: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
7030: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7040: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
7050: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
7060: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7070: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
7080: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
7090: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
70a0: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
70b0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
70c0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
70d0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
70e0: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
70f0: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7100: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
7110: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
7120: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
7130: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
7140: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
7150: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
7160: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7170: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
7180: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
7190: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
71a0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
71b0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
71c0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
71d0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
71e0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
71f0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7200: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7210: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7220: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7230: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7240: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
7250: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
7260: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7270: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
7280: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7290: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
72a0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
72b0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
72c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
72d0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
72e0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
72f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7300: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7310: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7320: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7330: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7340: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7350: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7360: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7370: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
7380: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
7390: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
73a0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
73b0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
73c0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
73d0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
73e0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
73f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7400: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7410: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7420: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7430: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
7440: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
7450: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
7460: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7470: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
7480: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
7490: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
74a0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
74b0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
74c0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
74d0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
74e0: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
74f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7500: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
7510: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7520: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
7530: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
7540: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7550: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
7560: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7570: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
7580: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
7590: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
75a0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
75b0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
75c0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
75d0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
75e0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
75f0: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7610: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
7620: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
7630: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
7640: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
7650: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
7660: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7670: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
7680: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
7690: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
76a0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
76b0: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
76c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
76d0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
76e0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
76f0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7700: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
7710: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
7720: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
7730: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7740: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
7750: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
7760: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
7770: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
7780: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7790: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
77a0: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
77b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
77c0: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
77d0: 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  ect) );.  sqlite
77e0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
77f0: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70  dFlags(pParse, p
7800: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
7810: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
7820: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
7830: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
7840: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
7850: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
7860: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
7870: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
7880: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
7890: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
78a0: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
78b0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
78c0: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
78d0: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
78e0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
78f0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7900: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
7910: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
7920: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
7930: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
7940: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
7950: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
7960: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7970: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7980: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7990: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
79a0: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
79b0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
79c0: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
79d0: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
79e0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
79f0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
7a00: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
7a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
7a20: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
7a30: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
7a40: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
7a50: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
7a60: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7a70: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7a80: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7a90: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7aa0: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7ab0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7ac0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7ad0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
7ae0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7af0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
7b00: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
7b10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7b20: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
7b30: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7b40: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
7b50: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7b60: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
7b70: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
7b80: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
7b90: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
7ba0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
7bb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
7bc0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
7bd0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
7be0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
7bf0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
7c00: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
7c10: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
7c20: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
7c30: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
7c40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7c50: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
7c60: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
7c70: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
7c80: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
7c90: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7ca0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7cb0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
7cc0: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
7cd0: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
7ce0: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
7cf0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7d00: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
7d10: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
7d20: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
7d30: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
7d40: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
7d50: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7d60: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
7d70: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
7d80: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7d90: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7da0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7db0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7dc0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7dd0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7de0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7df0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7e00: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7e10: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7e20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7e30: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7e40: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7e50: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7e60: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7e70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7e90: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7ea0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7eb0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7ec0: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7ed0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7ee0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7ef0: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
7f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7f10: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
7f20: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
7f30: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
7f40: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
7f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
7f60: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
7f70: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
7f80: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
7f90: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
7fa0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
7fb0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
7fc0: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
7fd0: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
7fe0: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
7ff0: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
8000: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
8010: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
8020: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
8030: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
8040: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
8050: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
8060: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
8070: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
8080: 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63  azVar[i] && strc
8090: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
80a0: 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  [i],z)==0 ){.   
80b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
80c0: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
80d0: 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20  ar)i+1;.        
80e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
80f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8100: 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
8110: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8120: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8130: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a  e->nVar);.    }.
8140: 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20      if( x>0 ){. 
8150: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
8160: 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20  e->nzVar ){.    
8170: 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20      char **a;.  
8180: 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
8190: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
81a0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a  Parse->azVar, x*
81b0: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
81c0: 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20         if( a==0 
81d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
81e0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
81f0: 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f  ailed ); /* Erro
8200: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
8210: 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  gh mallocFailed 
8220: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
8230: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
8240: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
8250: 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20  zVar = a;.      
8260: 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72    memset(&a[pPar
8270: 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28  se->nzVar], 0, (
8280: 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29  x-pParse->nzVar)
8290: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
82a0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
82b0: 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20  nzVar = x;.     
82c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30   }.      if( z[0
82d0: 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65  ]!='?' || pParse
82e0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20  ->azVar[x-1]==0 
82f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8300: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61  e3DbFree(db, pPa
8310: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29  rse->azVar[x-1])
8320: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8330: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73  ->azVar[x-1] = s
8340: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
8350: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  db, z, n);.     
8360: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
8370: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
8380: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
8390: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
83a0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
83b0: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
83c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
83d0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
83e0: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
83f0: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8400: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8410: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8420: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8430: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
8440: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
8450: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
8460: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8470: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
8480: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
8490: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
84a0: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
84b0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
84c0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
84d0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
84e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
84f0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8500: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8510: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8520: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
8530: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
8540: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
8550: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
8560: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
8570: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
8580: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
8590: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
85a0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
85b0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
85c0: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
85d0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
85e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
85f0: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
8610: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
8620: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
8630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8640: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8650: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8660: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8670: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
8680: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8690: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
86a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
86b0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
86c0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
86d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
86e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
86f0: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
8700: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
8710: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8720: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
8730: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
8740: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
8750: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8760: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8770: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8780: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8790: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
87a0: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
87b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
87c0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
87d0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
87e0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
87f0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8800: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8810: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8820: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8830: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8840: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8850: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8860: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8870: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8880: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8890: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
88a0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
88b0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
88c0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
88d0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
88e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
88f0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8900: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8910: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8920: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8930: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8940: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8950: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8960: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8970: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8980: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8990: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
89a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
89b0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
89c0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
89d0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
89e0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
89f0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8a00: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8a10: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8a20: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8a30: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8a40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8a50: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8a60: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8a70: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8a80: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8a90: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8aa0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8ab0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8b00: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8b10: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8b20: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8b30: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8b40: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8b50: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8b60: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8b70: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8b80: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8b90: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8ba0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8bb0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8bc0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8bd0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8be0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8bf0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8c00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8c10: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8c20: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8c30: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8c40: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8c50: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8c60: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8c70: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8c80: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8c90: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8ca0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
8cb0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
8cc0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
8cd0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
8ce0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
8cf0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
8d00: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
8d10: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
8d20: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
8d30: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
8d40: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8d50: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
8d60: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
8d70: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
8d80: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
8d90: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
8da0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
8db0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
8dc0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
8dd0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
8de0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
8df0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
8e00: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
8e10: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
8e20: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
8e30: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
8e40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
8e50: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
8e60: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
8e70: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
8e80: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
8e90: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
8ea0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
8eb0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
8ec0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
8ed0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
8ee0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
8ef0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
8f00: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
8f10: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
8f20: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
8f30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
8f40: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
8f50: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
8f60: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
8f70: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
8f80: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
8f90: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
8fa0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
8fb0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8fc0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8fd0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
8fe0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
8ff0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
9000: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
9010: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
9020: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9030: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
9040: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
9050: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
9060: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9070: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9080: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9090: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
90a0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a  lags ){.    nSiz
90b0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
90c0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
90d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
90e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
90f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
9100: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
9110: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9120: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
9130: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
9140: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9150: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
9160: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
9170: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9180: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
9190: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
91a0: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
91b0: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
91c0: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
91d0: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
91e0: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
91f0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9200: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
9210: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9220: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9230: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
9240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9250: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
9260: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9270: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
9280: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
9290: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
92a0: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
92b0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
92c0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
92d0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
92e0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
92f0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
9300: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
9310: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9320: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
9330: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9340: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
9350: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9360: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
9370: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
9380: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9390: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
93a0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
93b0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
93c0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
93d0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
93e0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
93f0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
9400: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9410: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
9420: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
9430: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
9440: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
9450: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
9460: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
9470: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
9480: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
9490: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
94a0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
94b0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
94c0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
94d0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
94e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
94f0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
9500: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
9510: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
9520: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
9530: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
9540: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
9550: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
9560: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
9570: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
9580: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
9590: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
95a0: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
95b0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
95c0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
95d0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
95e0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
95f0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
9600: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
9610: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
9620: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
9630: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
9640: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
9650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9660: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
9670: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
9680: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
9690: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
96a0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
96b0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
96c0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
96d0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
96e0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
96f0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
9700: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
9710: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
9720: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
9730: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
9750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9760: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
9770: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
9780: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
9790: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
97a0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
97b0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
97c0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
97d0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
97e0: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
97f0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9800: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
9810: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
9820: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
9830: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
9840: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
9850: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
9860: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
9870: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
9880: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
9890: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
98a0: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
98b0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
98c0: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
98d0: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
98e0: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
98f0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9900: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
9910: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9920: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70  Expr *p, int dup
9930: 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  Flags, u8 **pzBu
9940: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
9950: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
9960: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
9970: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f  n */.  u8 *zAllo
9980: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
9990: 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f  Memory space fro
99a0: 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64  m which to build
99b0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a   Expr object */.
99c0: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
99d0: 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74  ;       /* EP_St
99e0: 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f  atic if space no
99f0: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
9a00: 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73  malloc */..  ass
9a10: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9a20: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
9a30: 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d  ssert( dupFlags=
9a40: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9a50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9a60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75  ;.  assert( pzBu
9a70: 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  ffer==0 || dupFl
9a80: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9a90: 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  UCE );..  /* Fig
9aa0: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
9ab0: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
9ac0: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
9ad0: 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72  /.  if( pzBuffer
9ae0: 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d   ){.    zAlloc =
9af0: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
9b00: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
9b10: 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b  Static;.  }else{
9b20: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71  .    zAlloc = sq
9b30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9b40: 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  NN(db, dupedExpr
9b50: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9b60: 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  ));.    staticFl
9b70: 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  ag = 0;.  }.  pN
9b80: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
9b90: 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  loc;..  if( pNew
9ba0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e   ){.    /* Set n
9bb0: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
9bc0: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
9bd0: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
9be0: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a  pointed to.    *
9bf0: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
9c00: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
9c10: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
9c20: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
9c30: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
9c40: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
9c50: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9c60: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
9c70: 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sumed.    ** by 
9c80: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
9c90: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9ca0: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
9cb0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
9cc0: 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69  signed nStructSi
9cd0: 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  ze = dupedExprSt
9ce0: 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46  ructSize(p, dupF
9cf0: 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74  lags);.    const
9d00: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
9d10: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
9d20: 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  fff;.    int nTo
9d30: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ken;.    if( !Ex
9d40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9d50: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9d60: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9d70: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
9d80: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9d90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
9da0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9db0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
9dc0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46    }.    if( dupF
9dd0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73  lags ){.      as
9de0: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
9df0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
9e00: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
9e10: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9e20: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
9e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
9e40: 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29  32 nSize = (u32)
9e50: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
9e60: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9e70: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
9e80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
9e90: 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  ze<EXPR_FULLSIZE
9ea0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d   ){ .        mem
9eb0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
9ec0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
9ed0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
9ee0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9ef0: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
9f00: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
9f10: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
9f20: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
9f30: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70  iately. */.    p
9f40: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
9f50: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9f60: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
9f70: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
9f80: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9f90: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
9fa0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9fb0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
9fc0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
9fd0: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
9fe0: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
9ff0: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
a000: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
a010: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
a020: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
a030: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
a040: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
a050: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
a060: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
a070: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
a080: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Token);.    }.. 
a090: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
a0a0: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
a0b0: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
a0c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a0d0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a0e0: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a0f0: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a100: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a110: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a120: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a130: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a140: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a150: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a160: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a170: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a190: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a1a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a1b0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a1c0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a1d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a1e0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a1f0: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a200: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a210: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a220: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a230: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a240: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a250: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a260: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a270: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a280: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a290: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a2a0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ed) ){.        p
a2b0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a2c0: 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20  pLeft ?.        
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a2e0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
a2f0: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
a300: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a310: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a320: 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
a330: 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ht ?.           
a340: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a350: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
a360: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a370: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a390: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a3a0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
a3b0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
a3c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a3d0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a3e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
a3f0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
a400: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a410: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a420: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a430: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a440: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a460: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a470: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a480: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a4a0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a4b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a4c0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a4d0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a4e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a4f0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a500: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a510: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a520: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a530: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a540: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a550: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a560: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a570: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a580: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a590: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a5a0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a5b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a5c0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a5d0: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a5e0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a5f0: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a600: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a610: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a620: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a630: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a640: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a650: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a660: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a670: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a690: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a6a0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a6b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a6c0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a6d0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a6e0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a6f0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a700: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a710: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a720: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a730: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a740: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a750: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a760: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a770: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a780: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a790: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a7a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a7b0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a7c0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a7d0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a7e0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a7f0: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a800: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a810: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a820: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a830: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a840: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a850: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a860: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a870: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a880: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a890: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a8a0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a8b0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a8c0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a8d0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a8e0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a8f0: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a900: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a910: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a920: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a930: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a940: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a950: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a960: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a970: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a980: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a990: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a9a0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a9b0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a9c0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a9d0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a9e0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a9f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
aa00: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
aa10: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
aa20: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
aa30: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
aa40: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
aa50: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
aa60: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa70: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa80: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aa90: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aaa0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aab0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aac0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aad0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aae0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aaf0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
ab00: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
ab10: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
ab20: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
ab30: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
ab40: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
ab50: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
ab60: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab70: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab80: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
ab90: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
aba0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
abb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
abc0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
abd0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
abe0: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
abf0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ac00: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ac10: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
ac20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
ac30: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
ac40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ac50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
ac60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ac70: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
ac80: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
ac90: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
aca0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
acb0: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
acc0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
acd0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
ace0: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
acf0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
ad00: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
ad10: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
ad20: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69  llocRawNN(db,  i
ad30: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
ad40: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
ad50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
ad60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
ad70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ad80: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
ad90: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
ada0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
adb0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
adc0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
add0: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
ade0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
adf0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
ae00: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
ae10: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
ae20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
ae30: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
ae40: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ae50: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
ae60: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
ae70: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
ae80: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
ae90: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
aea0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
aeb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
aec0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
aed0: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
aee0: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
aef0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
af00: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
af10: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
af20: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
af30: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
af40: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
af50: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
af60: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
af70: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
af80: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
af90: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
afa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
afb0: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
afc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
afd0: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
afe0: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
aff0: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
b000: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
b010: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
b020: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
b030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b040: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
b050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b060: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
b070: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b080: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
b090: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
b0a0: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
b0b0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
b0c0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b0d0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b0e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b0f0: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b100: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b110: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b120: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b130: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b140: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b150: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b160: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b170: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b180: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b190: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b1a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b1b0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b1c0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b1d0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b1e0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b1f0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b200: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b210: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b220: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b230: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b240: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b250: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b260: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b270: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b280: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b290: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b2a0: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b2b0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b2c0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b2d0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b2e0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b2f0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b300: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b310: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b320: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b330: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b340: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b350: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b360: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b370: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b380: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b390: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b3a0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b3b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b3c0: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b3d0: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b3e0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b3f0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b400: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b410: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b420: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b430: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b440: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b450: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b460: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b470: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b480: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b490: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b4a0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b4b0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b4c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b4d0: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b4f0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b500: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b510: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b520: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b530: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b540: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b550: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b560: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
b570: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b580: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b590: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b5a0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b5b0: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b5c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b5d0: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b5e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b5f0: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b600: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b610: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b620: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b630: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b640: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b650: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b660: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b670: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b680: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b690: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b6a0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b6b0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b6c0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b6d0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b6e0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b6f0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b700: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b710: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b720: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b730: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b740: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b750: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b760: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b770: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b780: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b790: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b7a0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
b7b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b7c0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
b7d0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
b7e0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
b7f0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
b800: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
b810: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
b820: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
b830: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
b840: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
b850: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
b860: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
b870: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
b880: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b890: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
b8a0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
b8b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
b8c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
b8d0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
b8e0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
b8f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
b900: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
b910: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
b920: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b930: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b940: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b950: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
b960: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
b970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b980: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
b990: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
b9a0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
b9b0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b9c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
b9d0: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65   *pPrior;.  asse
b9e0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b9f0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
ba00: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
ba10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
ba20: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  N(db, sizeof(*p)
ba30: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
ba40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ba50: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
ba60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ba70: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
ba80: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
ba90: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
baa0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
bab0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
bac0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
bad0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bae0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
baf0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
bb00: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
bb10: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
bb20: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
bb30: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
bb40: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
bb50: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
bb60: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
bb70: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
bb80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bb90: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
bba0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
bbb0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
bbc0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
bbd0: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
bbe0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
bbf0: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
bc00: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
bc10: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
bc20: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
bc30: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
bc40: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
bc50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bc60: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
bc70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
bc80: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bc90: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
bca0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
bcb0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
bcc0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
bcd0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
bce0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bcf0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bd00: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
bd10: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
bd20: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
bd30: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
bd40: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  -1;.  pNew->nSel
bd50: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bd60: 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e  ectRow;.  pNew->
bd70: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
bd80: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
bd90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
bda0: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
bdb0: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  SelName);.  retu
bdc0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
bdd0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bde0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bdf0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
be00: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
be10: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
be20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
be30: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
be40: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
be50: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
be60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
be70: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
be80: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
be90: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
bea0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
beb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
bec0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
bed0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
bee0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
bef0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
bf00: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
bf10: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
bf20: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
bf30: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
bf40: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
bf50: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
bf60: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
bf70: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
bf80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bf90: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
bfa0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
bfb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
bfc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
bfd0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
bfe0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
bff0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
c000: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
c010: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
c020: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c030: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
c040: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
c050: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
c060: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c070: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
c080: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
c090: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
c0a0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
c0b0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c0c0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
c0d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c0f0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c100: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
c110: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
c120: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c130: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c140: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c150: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
c160: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
c170: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
c180: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
c190: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
c1a0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
c1b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c1c0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
c1d0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c1e0: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
c1f0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c200: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
c210: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
c220: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c230: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
c240: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c250: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c260: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c270: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c280: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
c290: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
c2a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c2b0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c2c0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c2d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
c2e0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
c2f0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
c300: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
c310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c320: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c330: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c340: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c350: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c360: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c370: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c380: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c390: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c3a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c3b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c3c0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c3d0: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c3e0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c3f0: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c400: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c410: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c420: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c430: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c440: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c450: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c460: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c470: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c480: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c490: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c4a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c4b0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c4c0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c4d0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c4e0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c4f0: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c500: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c  ubquery on the L
c510: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c520: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c530: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c540: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c550: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c560: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c570: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c580: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c590: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c5a0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c5b0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c5c0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c5d0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c5e0: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c5f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c600: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c610: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c620: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c640: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c650: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c660: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c670: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c680: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c690: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c6a0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c6b0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c6c0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
c6d0: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
c6e0: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
c6f0: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
c700: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
c710: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
c720: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
c730: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
c740: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
c750: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
c760: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
c770: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
c780: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
c790: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c7a0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  .  n = sqlite3Ex
c7b0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c7c0: 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75  pr);.  if( pColu
c7d0: 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20  mns->nId!=n ){. 
c7e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c7f0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
c800: 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
c810: 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e  pColumns->nId, n
c840: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74  );.    goto vect
c850: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c860: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c870: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  i<n; i++){.    E
c880: 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20  xpr *pSubExpr = 
c890: 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65  sqlite3ExprForVe
c8a0: 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65  ctorField(pParse
c8b0: 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20  , pExpr, i);.   
c8c0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c8d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c8e0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
c8f0: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
c900: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
c910: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
c920: 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31  Expr==iFirst+i+1
c930: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
c940: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
c950: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75  1].zName = pColu
c960: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  mns->a[i].zName;
c970: 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d  .      pColumns-
c980: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
c990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c9a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
c9b0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28  ELECT ){.    if(
c9c0: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
c9d0: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
c9e0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c9f0: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  ( pList->a[iFirs
ca00: 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t].pExpr->op==TK
ca10: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
ca20: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
ca30: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e  [iFirst].pExpr->
ca40: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
ca50: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b        pExpr = 0;
ca60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74  .    }.  }..vect
ca70: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a  or_append_error:
ca80: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
ca90: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
caa0: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
cab0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
cac0: 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mns);.  return p
cad0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  List;.}../*.** S
cae0: 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  et the sort orde
caf0: 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65  r for the last e
cb00: 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69  lement on the gi
cb10: 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  ven ExprList..*/
cb20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
cb30: 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
cb40: 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  r(ExprList *p, i
cb50: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a  nt iSortOrder){.
cb60: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
cb70: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53  urn;.  assert( S
cb80: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
cb90: 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53  ED<0 && SQLITE_S
cba0: 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49  O_ASC>=0 && SQLI
cbb0: 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a  TE_SO_DESC>0 );.
cbc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78    assert( p->nEx
cbd0: 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53  pr>0 );.  if( iS
cbe0: 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20  ortOrder<0 ){.  
cbf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70    assert( p->a[p
cc00: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
cc10: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
cc20: 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ASC );.    retur
cc30: 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d  n;.  }.  p->a[p-
cc40: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
cc50: 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f  der = (u8)iSortO
cc60: 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rder;.}../*.** S
cc70: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
cc80: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
cc90: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
cca0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
ccb0: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
ccc0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
ccd0: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
cce0: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
ccf0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
cd00: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
cd10: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
cd20: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
cd30: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
cd40: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
cd50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
cd60: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
cd70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cd80: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
cd90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cdb0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cdc0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cdd0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
cde0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
cdf0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
ce00: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
ce10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
ce20: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
ce30: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
ce40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ce50: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
ce60: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
ce70: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
ce80: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
ce90: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
cea0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
ceb0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
cec0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ced0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
cee0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
cef0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
cf00: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
cf10: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
cf20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
cf30: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
cf40: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
cf50: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
cf60: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
cf70: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
cf80: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
cf90: 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44  quote ) sqlite3D
cfa0: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
cfb0: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
cfc0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
cfd0: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
cfe0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
cff0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
d000: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
d010: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
d020: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
d030: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
d040: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
d050: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
d060: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d070: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d080: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d090: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d0a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d0b0: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d0c0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d0d0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
d0e0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
d0f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d100: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d110: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d120: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d130: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d140: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d150: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
d160: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
d170: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
d180: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
d190: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d1a0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d1b0: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
d1c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
d1d0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
d1e0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
d1f0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d200: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d210: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
d220: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d230: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
d240: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
d250: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
d260: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
d270: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
d280: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d290: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
d2a0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
d2b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
d2c0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
d2d0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
d310: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
d320: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
d330: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
d340: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
d350: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
d360: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
d370: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
d380: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
d390: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
d3a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
d3b0: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
d3c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
d3d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d3e0: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
d3f0: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
d400: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
d410: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d420: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
d430: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
d440: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d450: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
d460: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
d470: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
d480: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
d490: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d4a0: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
d4b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d4c0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
d4d0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
d4e0: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
d4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
d500: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
d510: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73  ssion list..*/.s
d520: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
d530: 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c  NLINE void exprL
d540: 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  istDeleteNN(sqli
d550: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
d560: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
d570: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
d580: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d590: 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  m;.  assert( pLi
d5a0: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73  st->a!=0 || pLis
d5b0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20  t->nExpr==0 );. 
d5c0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
d5d0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
d5e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
d5f0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
d600: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d610: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
d620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
d630: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
d640: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
d650: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
d660: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
d670: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d680: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
d690: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d6a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69  b, pList);.}.voi
d6b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d6c0: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
d6d0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
d6e0: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69  List){.  if( pLi
d6f0: 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c  st ) exprListDel
d700: 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  eteNN(db, pList)
d710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d720: 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52  n the bitwise-OR
d730: 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61   of all Expr.fla
d740: 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gs fields in the
d750: 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69   given.** ExprLi
d760: 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  st..*/.u32 sqlit
d770: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
d780: 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a  const ExprList *
d790: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
d7a0: 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20  .  u32 m = 0;.  
d7b0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
d7d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
d7e0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
d7f0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
d800: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61  .pExpr;.       a
d810: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
d820: 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70  );.       m |= p
d830: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Expr->flags;.   
d840: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d850: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  m;.}../*.** Thes
d860: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
d870: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
d880: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
d890: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
d8a0: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
d8b0: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
d8c0: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
d8d0: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
d8e0: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
d8f0: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
d900: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
d910: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
d920: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
d930: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
d940: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
d950: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
d960: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
d970: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
d980: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d990: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
d9a0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
d9b0: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
d9c0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d9d0: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
d9e0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d9f0: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
da00: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
da10: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
da20: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
da30: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
da40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
da50: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
da60: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
da70: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
da80: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
da90: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
daa0: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
dab0: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
dac0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
dad0: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
dae0: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
daf0: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
db00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
db10: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
db20: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
db30: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
db40: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
db50: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
db60: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
db70: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
db80: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
db90: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
dba0: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
dbb0: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
dbc0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
dbd0: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
dbe0: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
dbf0: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
dc00: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
dc10: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
dc20: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
dc30: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
dc40: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
dc50: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
dc60: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
dc70: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
dc80: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
dc90: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
dca0: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
dcb0: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
dcc0: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
dcd0: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
dce0: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
dcf0: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
dd00: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
dd10: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
dd20: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
dd30: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
dd40: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
dd50: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
dd60: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
dd70: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
dd80: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
dd90: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
dda0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
ddb0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
ddc0: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
ddd0: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
dde0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
ddf0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
de00: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
de10: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
de20: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
de30: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
de40: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
de50: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
de60: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
de70: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
de80: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
de90: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
dea0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
deb0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
dec0: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
ded0: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
dee0: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
def0: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
df00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
df10: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
df20: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
df30: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
df40: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
df50: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
df60: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
df70: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
df80: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
df90: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
dfa0: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
dfb0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
dfc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
dfd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
dfe0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
dff0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e000: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e010: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e020: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
e030: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
e040: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
e050: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
e060: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
e070: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e080: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
e090: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e0a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e0b0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
e0c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e0d0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
e0e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e0f0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e100: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
e110: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
e120: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
e130: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
e140: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
e150: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e160: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
e170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e180: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e190: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e1a0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
e1c0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
e1d0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
e1e0: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
e1f0: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
e200: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
e210: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
e220: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
e230: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
e240: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
e250: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
e260: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
e270: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
e280: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
e290: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
e2a0: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
e2b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
e2c0: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
e2d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
e2e0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
e2f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
e300: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
e310: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
e320: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
e330: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
e340: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
e350: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
e360: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
e370: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e380: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
e390: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e3b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
e3c0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
e3d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e3e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
e3f0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
e400: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
e410: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
e420: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e430: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
e440: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
e450: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
e460: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
e470: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e480: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
e490: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
e4a0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
e4b0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
e4c0: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
e4d0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e4e0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
e4f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e500: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
e510: 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69  C_Abort;.}.stati
e520: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
e530: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
e540: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
e550: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
e560: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
e570: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
e580: 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67  eCode = initFlag
e590: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
e5a0: 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
e5b0: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53  Constant;.  w.xS
e5c0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
e5d0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e5e0: 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72  tant;.  w.u.iCur
e5f0: 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
e600: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
e610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
e620: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
e630: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e640: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e650: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e660: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
e670: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
e680: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
e690: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
e6a0: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
e6b0: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
e6c0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
e6d0: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
e6e0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
e6f0: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
e700: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
e710: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
e720: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
e730: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
e740: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
e750: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
e760: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
e770: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
e780: 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
e790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
e7a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e7b0: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
e7c0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e7d0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
e7e0: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
e7f0: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
e800: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
e810: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
e820: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
e830: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
e840: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
e850: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
e860: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
e870: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
e880: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
e890: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e8a0: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
e8b0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
e8c0: 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
e8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
e8e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
e8f0: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
e900: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
e910: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
e920: 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
e930: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
e940: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
e950: 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
e960: 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
e970: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
e980: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
e990: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
e9a0: 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
e9b0: 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
e9c0: 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
e9d0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
e9e0: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
e9f0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
ea00: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
ea10: 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
ea20: 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ur);.}../*.** Wa
ea30: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
ea40: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
ea50: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
ea60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
ea70: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
ea80: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
ea90: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
eaa0: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
eab0: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
eac0: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
ead0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
eae0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
eaf0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
eb00: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
eb10: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
eb20: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
eb30: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
eb40: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
eb50: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
eb60: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
eb70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
eb80: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
eb90: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
eba0: 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
ebb0: 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
ebc0: 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
ebd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
ebe0: 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
ebf0: 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64  nit, 0);.}..#ifd
ec00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ec10: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
ec20: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
ec30: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
ec40: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
ec50: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
ec60: 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  s a.** subquery 
ec70: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52  of some kind.  R
ec80: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
ec90: 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69   are no subqueri
eca0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
ecb0: 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75  e3ExprContainsSu
ecc0: 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b  bquery(Expr *p){
ecd0: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
ece0: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
ecf0: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
ed00: 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
ed10: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
ed20: 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
ed30: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
ed40: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
ed50: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
ed60: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
ed70: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
ed80: 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65  w.eCode==0;.}.#e
ed90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
eda0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
edb0: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
edc0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
edd0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
ede0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
edf0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
ee00: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
ee10: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
ee20: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
ee30: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
ee40: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
ee50: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
ee60: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
ee70: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
ee80: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
ee90: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
eea0: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
eeb0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
eec0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
eed0: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
eee0: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
eef0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  int rc = 0;..  /
ef00: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
ef10: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
ef20: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
ef30: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
ef40: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
ef50: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
ef60: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
ef70: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
ef80: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
ef90: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
efa0: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
efb0: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
efc0: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
efd0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
efe0: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
eff0: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
f000: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
f010: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
f020: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
f030: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
f040: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
f050: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
f060: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
f070: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
f080: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f090: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
f0a0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
f0b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f0c0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
f0d0: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
f0e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f0f0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
f100: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
f110: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
f120: 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
f130: 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
f140: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
f150: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
f160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f170: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
f180: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
f190: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f1a0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
f1b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
f1c0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
f1d0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
f1e0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
f1f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
f200: 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
f210: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f220: 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
f230: 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
f240: 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
f250: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f260: 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
f270: 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
f280: 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
f290: 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
f2a0: 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
f2b0: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
f2c0: 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
f2d0: 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
f2e0: 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
f2f0: 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
f300: 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
f310: 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
f320: 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
f330: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
f340: 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
f350: 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
f360: 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
f370: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
f380: 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
f390: 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
f3a0: 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
f3b0: 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
f3c0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
f3d0: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
f3e0: 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
f3f0: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
f400: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f410: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
f420: 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
f430: 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
f440: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
f450: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
f460: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
f470: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
f480: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
f490: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
f4a0: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
f4b0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
f4c0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
f4d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
f4e0: 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
f4f0: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
f500: 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
f510: 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
f520: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
f530: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61    assert( p->pTa
f540: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  b!=0 );.      re
f550: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
f560: 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
f570: 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
f580: 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
f590: 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d  n>=0 && p->pTab-
f5a0: 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
f5b0: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
f5c0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f5d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f5f0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
f600: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
f610: 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
f620: 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
f630: 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
f640: 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
f650: 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
f660: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
f670: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
f680: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f690: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
f6a0: 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
f6b0: 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
f6c0: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
f6d0: 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
f6e0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
f6f0: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
f700: 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
f710: 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
f720: 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
f730: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
f740: 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
f750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f760: 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
f770: 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
f780: 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
f790: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
f7a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f7b0: 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
f7c0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
f7d0: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
f7e0: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
f7f0: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
f800: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
f810: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
f820: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
f830: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
f840: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f850: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
f860: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
f870: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
f880: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
f890: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
f8a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
f8b0: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
f8c0: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
f8d0: 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
f8e0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
f8f0: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
f900: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
f910: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
f920: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
f930: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
f940: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
f950: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f960: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f970: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
f980: 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
f990: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
f9a0: 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
f9b0: 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
f9c0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
f9d0: 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
f9e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
f9f0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
fa00: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
fa10: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
fa20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
fa30: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
fa40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
fa50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
fa60: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
fa70: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
fa80: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
fa90: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
faa0: 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
fab0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
fac0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fad0: 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
fae0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
faf0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fb00: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
fb10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
fb20: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fb30: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
fb40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
fb50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
fb60: 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  X is the RHS of 
fb70: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
fb80: 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45   If pX is a SELE
fb90: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
fba0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d   that can be sim
fbb0: 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72  plified to a dir
fbc0: 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73  ect table access
fbd0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
fbe0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
fbf0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
fc00: 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f  nt.  If pX is no
fc10: 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  t a SELECT state
fc20: 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  ment,.** or if t
fc30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fc40: 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ent needs to be 
fc50: 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20  manifested into 
fc60: 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74  a transient.** t
fc70: 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72  able, then retur
fc80: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64  n NULL..*/.#ifnd
fc90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
fca0: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
fcb0: 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
fcc0: 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
fcd0: 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  *pX){.  Select *
fce0: 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  p;.  SrcList *pS
fcf0: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
fd00: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
fd10: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pTab;.  int i;.
fd20: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
fd30: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
fd40: 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72  sSelect) ) retur
fd50: 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73  n 0;  /* Not a s
fd60: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  ubquery */.  if(
fd70: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fd80: 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  (pX, EP_VarSelec
fd90: 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20  t)  ) return 0; 
fda0: 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73   /* Correlated s
fdb0: 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d  ubq */.  p = pX-
fdc0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  >x.pSelect;.  if
fdd0: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
fde0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
fdf0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
fe00: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
fe10: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
fe20: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
fe30: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
fe40: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
fe50: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
fe60: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
fe70: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
fe80: 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
fe90: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
fea0: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
feb0: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
fec0: 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
fed0: 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
fee0: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
fef0: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
ff00: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
ff10: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
ff20: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
ff30: 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
ff40: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
ff50: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
ff60: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
ff70: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ff90: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
ffa0: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
ffb0: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffd0: 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
ffe0: 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
fff0: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
10000 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10010 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
10020 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10030 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
10040 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
10050 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
10060 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
10070 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
10080 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
10090 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
100a0 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
100b0 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
100c0 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
100d0 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
100e0 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
100f0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
10100 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
10110 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
10120 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
10130 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
10140 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
10150 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
10160 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
10170 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
10180 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10190 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
101a0 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
101b0 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
101c0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
101d0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
101e0 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
101f0 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
10200 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
10210 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
10220 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
10230 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
10240 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
10250 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
10260 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
10270 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
10280 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
10290 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
102a0 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
102b0 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
102c0 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
102d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
102e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
102f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10300 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
10310 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
10320 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
10330 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
10340 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
10350 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
10360 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
10370 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
10380 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
10390 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
103a0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
103b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
103c0 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
103d0 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
103e0 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
103f0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
10400 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
10410 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
10420 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10430 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10440 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
10450 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
10460 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
10470 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
10480 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
10490 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
104a0 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
104b0 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
104c0 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
104d0 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
104e0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
104f0 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
10500 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
10510 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
10520 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
10530 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
10540 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
10550 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
10560 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
10570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10580 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
10590 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
105a0 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
105b0 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
105c0 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
105d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
105e0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
105f0 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
10600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10610 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
10620 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
10630 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
10640 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10650 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
10660 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
10670 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
10680 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
10690 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
106a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
106b0 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
106c0 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
106d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
106e0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
106f0 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
10700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
10710 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
10720 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
10730 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
10740 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
10750 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
10760 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
10770 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
10780 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
10790 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
107a0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
107b0 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
107c0 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
107d0 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
107e0 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
107f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
10800 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
10810 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
10820 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
10830 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
10840 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
10850 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
10860 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
10870 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
10880 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
10890 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
108a0 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
108b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
108c0 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
108d0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
108e0 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
108f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10900 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
10910 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
10920 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
10930 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
10940 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
10950 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
10960 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
10970 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
10980 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
10990 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
109a0 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
109b0 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
109c0 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
109d0 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
109e0 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
109f0 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
10a00 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
10a10 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
10a20 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
10a30 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
10a40 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
10a50 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
10a60 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
10a70 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
10a80 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
10a90 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
10aa0 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
10ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
10ac0 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
10ad0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
10ae0 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
10af0 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
10b00 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
10b10 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
10b20 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
10b30 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
10b40 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
10b50 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
10b60 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
10b70 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10b80 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
10b90 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
10ba0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
10bb0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
10bc0 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
10bd0 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
10be0 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
10bf0 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
10c00 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10c10 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
10c20 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
10c50 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
10c60 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
10c70 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
10c80 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
10c90 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
10ca0 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
10cd0 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
10ce0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
10cf0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
10d00 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
10d10 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
10d20 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
10d30 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
10d40 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
10d50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10d60 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
10d70 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
10d80 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
10d90 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
10da0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
10db0 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
10dc0 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
10dd0 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
10de0 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
10df0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
10e00 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
10e10 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
10e20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
10e30 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
10e40 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
10e50 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
10e60 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
10e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
10e80 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
10e90 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c  t contain exactl
10ea0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  y one of the bit
10eb0 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
10ec0 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
10ed0 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69  NDEX_LOOP.  If i
10ee0 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
10ef0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
10f00 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
10f10 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
10f20 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
10f30 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62  r a.** fast memb
10f40 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
10f50 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
10f60 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
10f70 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78   the.** IN index
10f80 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
10f90 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
10fa0 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
10fb0 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70   of the.** IN op
10fc0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
10fd0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
10fe0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
10ff0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
11000 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
11010 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
11020 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
11030 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
11040 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
11050 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
11060 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11070 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
11080 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
11090 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
110a0 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
110b0 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
110c0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
110d0 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
110e0 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
110f0 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
11100 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
11110 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
11120 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
11130 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
11140 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
11150 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
11160 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
11170 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
11180 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11190 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
111a0 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
111b0 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
111c0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
111d0 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
111e0 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
111f0 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
11200 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
11210 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
11220 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
11230 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
11240 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
11250 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
11260 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
11270 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11280 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11290 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
112a0 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
112b0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
112c0 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
112d0 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
112e0 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
112f0 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
11300 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
11310 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
11320 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
11330 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
11340 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
11350 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
11360 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
11370 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
11380 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
11390 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
113a0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
113b0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
113c0 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
113d0 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
113e0 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
113f0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
11400 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
11410 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
11420 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
11430 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
11440 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
11450 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
11460 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
11470 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
11480 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
11490 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
114a0 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
114b0 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
114c0 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
114d0 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
114e0 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
114f0 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
11500 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
11510 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
11520 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
11530 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
11540 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
11550 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
11560 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
11570 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
11580 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
11590 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
115a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
115b0 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
115c0 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
115d0 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
115e0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
115f0 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
11600 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
11610 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
11620 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
11630 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
11640 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
11650 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
11660 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
11670 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
11680 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
11690 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
116a0 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
116b0 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
116c0 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
116d0 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
116e0 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
116f0 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
11700 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
11710 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
11720 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
11730 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
11740 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
11750 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
11760 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
11770 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
11780 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
11790 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
117a0 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
117b0 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
117c0 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
117d0 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
117e0 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
117f0 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
11800 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
11810 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
11820 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
11830 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
11840 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
11850 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
11860 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
11870 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
11880 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11890 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
118a0 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
118b0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
118c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
118d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
118e0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
118f0 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
11900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
11910 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
11920 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
11930 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
11940 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
11950 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
11960 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
11970 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
11980 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
11990 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
119a0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
119b0 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
119c0 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
119d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
11a00 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
11a10 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
11a20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
11a50 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
11a60 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
11a70 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
11a80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
11aa0 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
11ab0 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
11ac0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
11ad0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
11ae0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11af0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
11b00 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
11b10 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b30 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
11b40 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
11b50 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11b60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11b70 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
11b80 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
11b90 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
11ba0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
11bb0 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
11bc0 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
11bd0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
11be0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
11bf0 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
11c00 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
11c10 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
11c20 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
11c30 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
11c40 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
11c50 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
11c60 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
11c70 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
11c80 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
11c90 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
11ca0 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
11cb0 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
11cc0 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
11cd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
11ce0 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
11cf0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
11d00 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
11d10 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
11d20 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
11d30 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
11d40 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
11d50 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
11d60 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11d70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
11d80 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11d90 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
11da0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
11db0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
11dc0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11dd0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11de0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
11df0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11e00 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
11e10 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
11e20 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11e30 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
11e40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
11e50 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
11e60 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
11e70 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
11e80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
11e90 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
11ea0 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
11eb0 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
11ec0 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
11ed0 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
11ee0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
11ef0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
11f00 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
11f10 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
11f20 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
11f30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11f40 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
11f50 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11f60 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
11f70 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
11fa0 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
11fb0 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11fe0 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
11ff0 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
12000 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
12010 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
12020 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
12030 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
12040 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12060 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12070 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12080 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12090 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
120a0 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
120b0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
120c0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
120d0 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
120e0 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12100 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12110 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12120 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
12130 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
12140 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
12150 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
12160 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
12170 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
12180 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
12190 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
121a0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
121b0 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
121c0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
121d0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
121e0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
121f0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
12200 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
12210 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
12220 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
12230 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
12240 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
12250 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
12260 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
12270 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
12280 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12290 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
122a0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
122b0 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
122c0 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
122d0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
122e0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
122f0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
12300 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12310 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
12320 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12330 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12340 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12350 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
12360 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
12370 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
12380 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12390 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
123a0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
123b0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
123e0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
123f0 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
12400 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
12410 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
12420 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
12430 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
12440 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
12450 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
12460 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
12470 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
12480 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
12490 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
124a0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
124b0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
124c0 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
124d0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
124e0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
124f0 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
12500 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
12510 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
12520 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
12530 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
12540 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
12550 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
12560 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
12570 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
12580 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
12590 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
125a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
125b0 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
125c0 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
125d0 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
125e0 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
125f0 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
12600 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
12610 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
12620 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
12630 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
12640 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
12650 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
12660 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
12670 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
12680 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
12690 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
126a0 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
126b0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
126c0 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
126d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
126e0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
126f0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
12700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
12710 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
12720 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
12730 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
12740 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
12750 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
12760 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
12770 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
12780 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
12790 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
127a0 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
127b0 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
127c0 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
127d0 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
127e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
127f0 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
12800 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
12810 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
12820 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
12830 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12840 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
12850 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
12860 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12870 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
12880 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
12890 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
128a0 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
128b0 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
128c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
128d0 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e  .      if( affin
128e0 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ity_ok ){.      
128f0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
12900 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
12910 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b  x that will work
12920 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
12930 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
12940 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
12950 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
12960 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70  eType==0; pIdx=p
12970 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12980 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63         Bitmask c
12990 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  olUsed;      /* 
129a0 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  Columns of the i
129b0 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20  ndex used */.   
129c0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
129d0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
129e0 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72  Mask for the cur
129f0 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  rent column */. 
12a00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
12a10 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72  x->nColumn<nExpr
12a20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12a30 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
12a40 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
12a50 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
12a60 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
12a70 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
12a80 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
12a90 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
12aa0 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
12ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
12ac0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
12ad0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
12ae0 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
12af0 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
12b00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12b10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
12b20 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
12b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
12b40 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
12b50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12b60 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
12b70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
12b80 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
12b90 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
12ba0 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
12bb0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
12bd0 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
12be0 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
12bf0 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
12c00 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
12c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12c20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
12c30 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
12c40 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
12c50 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
12c60 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
12c70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
12c80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
12c90 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
12ca0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12cb0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12cc0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12cd0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
12ce0 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
12cf0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
12d00 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
12d10 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
12d20 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
12d30 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
12d40 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
12d50 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
12d60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12d70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
12d80 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
12d90 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
12da0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
12db0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
12dc0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
12dd0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12de0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
12df0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
12e00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12e20 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
12e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12e40 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
12e50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
12e60 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
12e70 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12e90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12ea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12eb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
12ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
12ee0 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
12f00 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
12f10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
12f20 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
12f30 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
12f40 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
12f50 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
12f60 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
12f70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
12f80 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
12f90 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
12fa0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
12fb0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
12fc0 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
12fd0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
12fe0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
12ff0 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
13000 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
13010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13020 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
13030 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
13040 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
13050 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
13060 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
13070 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
13080 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
13090 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
130a0 76 29 3b 0a 20 20 23 69 66 6e 64 65 66 20 53 51  v);.  #ifndef SQ
130b0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
130c0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  N.            sq
130d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
130e0 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30  v, OP_Explain, 0
130f0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
13100 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
13110 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20  intf(db, "USING 
13120 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
13130 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
13140 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
13150 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43        P4_DYNAMIC
13160 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
13170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13180 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13190 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
131a0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
131b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
131c0 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
131d0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
131e0 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dx);.           
131f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13200 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
13210 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
13220 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44    assert( IN_IND
13230 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d  EX_INDEX_DESC ==
13240 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
13250 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ASC+1 );.       
13260 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
13270 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13280 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
13290 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20  er[0];.  .      
132a0 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48        if( prRhsH
132b0 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  asNull ){.      
132c0 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
132d0 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
132e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 23 69 66 64 65 66  ->nMem;.  #ifdef
132f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
13300 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36                i6
13320 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78  4 mask = (1<<nEx
13330 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  pr)-1;.         
13340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13350 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
13360 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20  _ColumnsUsed, . 
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38   iTab, 0, 0, (u8
13390 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36  *)&mask, P4_INT6
133a0 34 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  4);.  #endif.   
133b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
133c0 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Expr==1 ){.     
133d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
133e0 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
133f0 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
13400 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
13410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
13440 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
13450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
13460 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20         } /* End 
13470 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65  loop over indexe
13480 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20  s */.      } /* 
13490 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79  End if( affinity
134a0 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f  _ok ) */.    } /
134b0 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20  * End if not an 
134c0 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20  rowid index */. 
134d0 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70   } /* End attemp
134e0 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73  t to optimize us
134f0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a  ing an index */.
13500 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65  .  /* If no pree
13510 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73  xisting index is
13520 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
13530 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a  he IN clause.  *
13540 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e  * and IN_INDEX_N
13550 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65  OOP is an allowe
13560 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64  d reply.  ** and
13570 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
13580 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
13590 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62   list, not a sub
135a0 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74  query.  ** and t
135b0 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f  he RHS is not co
135c0 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77  nstant or has tw
135d0 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
135e0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  ,.  ** then it i
135f0 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61  s not worth crea
13600 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
13610 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75  l table to evalu
13620 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20  ate.  ** the IN 
13630 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75  operator so retu
13640 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
13650 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
13660 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46  pe==0.   && (inF
13670 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
13680 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21  NOOP_OK).   && !
13690 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
136a0 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
136b0 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65  ).   && (!sqlite
136c0 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
136d0 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c  (pX) || pX->x.pL
136e0 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20  ist->nExpr<=2). 
136f0 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   ){.    eType = 
13700 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
13710 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
13720 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
13730 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
13740 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
13750 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
13760 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
13770 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
13780 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
13790 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
137a0 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
137b0 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
137c0 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
137d0 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
137e0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
137f0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
13800 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
13810 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
13820 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
13830 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
13840 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
13850 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
13860 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
13870 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
13880 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13890 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
138a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
138b0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
138c0 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
138d0 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
138e0 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
138f0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
13900 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
13910 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13920 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13930 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
13940 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
13950 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
13960 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
13970 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
13980 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
13990 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
139a0 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
139b0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a  le = iTab;.  }..
139c0 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
139d0 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
139e0 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
139f0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
13a00 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
13a10 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
13a20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
13a30 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
13a40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13a50 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
13a60 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = i;.  }.  ret
13a70 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
13a80 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
13a90 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13aa0 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
13ab0 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
13ac0 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
13ad0 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
13ae0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
13af0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
13b00 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
13b10 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
13b20 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
13b30 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
13b40 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
13b50 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
13b60 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
13b70 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
13b80 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13b90 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
13ba0 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
13bb0 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
13bc0 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
13bd0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
13be0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
13bf0 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
13c00 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
13c10 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
13c20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
13c30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
13c40 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
13c50 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
13c60 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
13c70 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
13c80 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
13c90 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
13ca0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
13cb0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
13cc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
13cd0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
13ce0 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
13cf0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
13d00 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
13d10 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
13d20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13d30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
13d40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
13d50 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
13d60 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
13d70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
13d80 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
13d90 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
13da0 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
13db0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
13dc0 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
13dd0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
13de0 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
13df0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
13e00 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
13e10 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
13e20 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
13e30 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
13e40 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
13e50 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
13e60 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
13e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13e80 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
13e90 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
13ea0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
13eb0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
13ec0 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
13ed0 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
13ee0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
13ef0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
13f00 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
13f10 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
13f20 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
13f30 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
13f40 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
13f50 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
13f60 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
13f70 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
13f80 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
13f90 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
13fa0 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
13fb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13fc0 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
13fd0 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
13fe0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
13ff0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
14000 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
14010 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
14020 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
14030 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
14040 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
14050 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
14060 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
14070 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
14080 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
14090 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
140a0 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
140b0 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
140c0 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
140e0 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
140f0 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
14100 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
14110 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
14120 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
14130 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
14140 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
14150 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
14160 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
14170 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
14180 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
14190 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
141a0 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
141b0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
141c0 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
141d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
141e0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
141f0 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
14200 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
14210 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
14220 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
14230 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
14240 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
14250 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
14260 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
14270 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
14280 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
14290 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
142a0 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
142b0 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
142c0 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
142d0 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
142e0 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
142f0 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
14300 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
14310 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
14320 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
14330 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
14340 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
14350 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
14360 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
14370 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
14380 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
14390 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
143a0 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
143b0 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
143c0 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
143d0 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
143e0 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
143f0 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
14400 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
14410 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
14420 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
14430 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
14440 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
14450 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
14460 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
14470 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
14480 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
14490 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
144a0 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74  ult.  For a mult
144b0 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c  i-column SELECT,
144c0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
144d0 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
144e0 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f  guous.** array o
144f0 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
14500 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
14510 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
14520 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
14530 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75  t.** result colu
14540 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f  mn.  Return 0 fo
14550 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
14560 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
14570 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  curs..*/.#ifndef
14580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
14590 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
145a0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
145b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
145c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
145d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
145e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
145f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14600 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
14610 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
14620 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
14630 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
14640 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
14650 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
14660 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
14670 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
14680 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
14690 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
146a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
146b0 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
146c0 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
146d0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
146e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
146f0 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
14700 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
14710 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
14740 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
14750 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
14760 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14770 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
14780 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
14790 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
147a0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
147b0 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  se);..  /* The e
147c0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
147d0 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43   IN/EXISTS/SELEC
147e0 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74  T must be repeat
147f0 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ed every time it
14800 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74  .  ** is encount
14810 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ered if any of t
14820 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
14830 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
14840 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
14850 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
14860 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
14870 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
14880 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
14890 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
148a0 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
148b0 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
148c0 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
148d0 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
148e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
148f0 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
14900 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
14910 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
14920 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
14930 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
14940 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
14950 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
14960 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
14970 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
14980 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
14990 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
149a0 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
149b0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
149c0 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
149d0 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
149e0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23  erage(v);.  }..#
149f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14a00 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
14a10 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
14a20 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
14a30 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
14a40 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
14a50 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
14a60 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
14a70 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
14a80 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
14a90 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
14aa0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
14ab0 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
14ac0 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ",.        pPars
14ad0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14ae0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
14af0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14b00 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
14b10 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
14b20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
14b30 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
14b40 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
14b50 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
14b60 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
14b70 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
14ba0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
14bb0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
14bc0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
14bd0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
14be0 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
14bf0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
14c00 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
14c10 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
14c20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
14c30 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
14c40 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20  nt nVal;        
14c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
14c60 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65  ze of vector pLe
14c70 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20  ft */.      .   
14c80 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
14c90 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
14ca0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
14cb0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c  sert( !isRowid |
14cc0 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20  | nVal==1 );..  
14cd0 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
14ce0 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
14cf0 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
14d00 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
14d10 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
14d20 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
14d30 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
14d40 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
14d50 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
14d60 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
14d70 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  h index keys rep
14d80 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
14d90 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a  sults from the .
14da0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
14db0 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
14dc0 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
14dd0 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
14de0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
14df0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
14e00 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
14e10 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
14e20 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
14e30 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
14e40 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
14e50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
14e60 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
14e70 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
14e80 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
14e90 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
14ea0 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
14eb0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
14ec0 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
14ed0 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
14ee0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
14ef0 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
14f00 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
14f10 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
14f20 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
14f30 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
14f40 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
14f50 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
14f60 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
14f70 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
14f80 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
14f90 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
14fa0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
14fb0 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
14fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14fd0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14fe0 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20  emeral, .       
14ff0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
15000 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61  , (isRowid?0:nVa
15010 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  l));.      pKeyI
15020 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
15030 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
15040 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
15050 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20  db, nVal, 1);.. 
15060 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
15070 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15080 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
15090 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
150a0 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
150b0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
150c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
150d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
150e0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
150f0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
15100 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
15110 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
15120 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
15130 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
15140 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
15150 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
15160 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
15170 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
15180 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
15190 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
151a0 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
151b0 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
151c0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   );.        /* I
151d0 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48  f the LHS and RH
151e0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
151f0 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ator do not matc
15200 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  h, that.        
15210 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61  ** error will ha
15220 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c  ve been caught l
15230 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65  ong before we re
15240 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ach this point. 
15250 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  */.        if( A
15260 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
15270 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
15280 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
15290 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
152a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
152b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
152c0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
152d0 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
152e0 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
152f0 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
15300 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
15310 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
15320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
15330 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
15340 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
15350 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
15360 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
15370 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
15380 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
15390 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
153a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
153b0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
153c0 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
153d0 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
153e0 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
153f0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
15400 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oc() */.        
15410 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
15420 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
15430 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
15440 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15450 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
15460 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
15470 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
15480 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
15490 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
154a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
154b0 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
154c0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
154d0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
154e0 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
154f0 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
15500 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
15510 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69  !=0 ); /* OOM wi
15520 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66  ll cause exit af
15530 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ter sqlite3Selec
15540 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t() */.         
15550 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
15560 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
15570 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
15580 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
15590 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
155a0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
155b0 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
155c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   );.          fo
155d0 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
155e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
155f0 20 45 78 70 72 20 2a 70 20 3d 20 28 6e 56 61 6c   Expr *p = (nVal
15600 3e 31 29 20 3f 20 73 71 6c 69 74 65 33 56 65 63  >1) ? sqlite3Vec
15610 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
15620 70 4c 65 66 74 2c 20 69 29 20 3a 20 70 4c 65 66  pLeft, i) : pLef
15630 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
15640 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
15650 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
15660 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
15670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15680 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69   pParse, p, pELi
15690 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20  st->a[i].pExpr. 
156a0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
156b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
156c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
156d0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
156e0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
156f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
15700 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
15710 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
15720 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
15730 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
15740 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
15750 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
15760 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
15770 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
15780 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
15790 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
157a0 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
157b0 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
157c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
157d0 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
157e0 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
157f0 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
15800 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
15810 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
15820 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
15830 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
15840 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69         char affi
15850 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
15860 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
15870 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
15880 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  N */.        int
15890 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
158a0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
158b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
158c0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
158d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
158e0 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
158f0 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
15900 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
15910 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
15920 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ty(pLeft);.     
15930 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
15940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
15950 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
15960 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
15970 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15980 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
15990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
159a0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
159b0 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
159c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
159d0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
159e0 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
159f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15a00 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
15a10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
15a20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
15a30 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
15a40 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
15a50 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
15a60 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15a70 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15a80 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
15a90 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15aa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
15ab0 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
15ac0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15ad0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20  _Null, 0, r2);. 
15ae0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
15af0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
15b00 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
15b10 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
15b20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
15b30 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
15b40 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
15b50 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20   iValToIns;..   
15b60 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15b70 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
15b80 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
15b90 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
15ba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
15bb0 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
15bc0 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
15bd0 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
15be0 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
15bf0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
15c00 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
15c10 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
15c20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
15c30 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
15c40 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
15c50 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
15c60 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
15c70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15c80 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e      if( jmpIfDyn
15c90 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69  amic>=0 && !sqli
15ca0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
15cb0 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
15cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15cd0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
15ce0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49              jmpI
15d00 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20  fDynamic = -1;. 
15d10 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
15d20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
15d30 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
15d40 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
15d50 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
15d60 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
15d70 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
15d80 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
15d90 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
15da0 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
15db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15dc0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
15dd0 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
15de0 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
15df0 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
15e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15e10 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
15e20 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
15e30 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
15e40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15e50 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
15e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15e70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15e80 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15ec0 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
15ee0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15ef0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15f00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15f10 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72  OP_Insert, pExpr
15f20 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
15f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
15f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
15f70 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72  Record, r3, 1, r
15f80 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
15f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15fa0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15fb0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
15fc0 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20  Parse, r3, 1);. 
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15ff0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
16000 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
16010 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
16020 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
16030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16040 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16050 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16060 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16070 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16080 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
16090 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
160a0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
160b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
160c0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
160d0 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
160e0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
160f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
16100 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16110 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
16120 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
16130 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
16140 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65   {.      /* Case
16150 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e   3:    (SELECT .
16160 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
16170 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20     **     or:   
16180 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e   EXISTS(SELECT .
16190 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
161a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
161b0 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e  or a SELECT, gen
161c0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
161d0 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  t the values for
161e0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   all columns of.
161f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
16200 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61  st row into an a
16210 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
16220 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
16230 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20   index of.      
16240 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
16250 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  ister..      **.
16260 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
16270 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
16280 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20  rite an integer 
16290 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
162a0 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20  r 1 (exists).   
162b0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67     ** into a reg
162c0 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e  ister and return
162d0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
162e0 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  umber..      **.
162f0 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68        ** In both
16300 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72   cases, the quer
16310 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77  y is augmented w
16320 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20  ith "LIMIT 1".  
16330 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  Any .      ** pr
16340 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20  eexisting limit 
16350 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20  is discarded in 
16360 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77  place of the new
16370 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20   LIMIT 1..      
16380 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
16390 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
163b0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
163c0 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
163d0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
163e0 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
163f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
16400 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
16410 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f  SELECT result */
16420 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b  .      int nReg;
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16450 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  Registers to all
16460 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20  ocate */..      
16470 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
16480 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
16490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
164a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
164b0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
164c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
164d0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
164e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
164f0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
16500 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
16510 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16520 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20  xIsSelect) );.. 
16530 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
16540 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
16550 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72      nReg = pExpr
16560 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
16570 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e  ? pSel->pEList->
16580 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20  nExpr : 1;.     
16590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
165a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
165b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29   pParse->nMem+1)
165c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
165d0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
165e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
165f0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
16600 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
16610 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
16620 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74        dest.iSdst
16630 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
16640 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53  .        dest.nS
16650 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
16660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16670 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
16680 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
16690 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b  m, dest.iSDParm+
166a0 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nReg-1);.       
166b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
166c0 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
166d0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
166e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
166f0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16700 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
16710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16720 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
16730 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
16740 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
16750 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
16760 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
16770 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
16780 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
16790 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
167a0 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
167b0 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
167c0 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
167d0 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
167e0 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
16810 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
16820 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
16830 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
16840 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
16850 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
16860 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
16870 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
16880 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
16890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
168a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
168b0 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
168c0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
168d0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
168e0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
168f0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
16900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
16910 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
16920 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
16930 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
16940 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
16950 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
16960 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
16970 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
16980 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16990 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
169a0 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
169b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
169c0 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
169d0 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
169e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
169f0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
16a00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16a10 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
16a20 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
16a30 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
16a40 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
16a50 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
16a60 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
16a70 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
16a80 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
16a90 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
16aa0 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
16ab0 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
16ac0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
16ad0 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
16ae0 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
16af0 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
16b00 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
16b10 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
16b20 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
16b30 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
16b40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16b50 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
16b60 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
16b70 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
16b80 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
16b90 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
16ba0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
16bb0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
16bc0 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
16bd0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
16be0 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
16bf0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
16c00 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
16c10 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
16c20 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
16c30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16c40 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
16c50 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
16c60 29 7b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 2d  ){.    if( (pIn-
16c70 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
16c80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75  .      sqlite3Su
16ca0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
16cb0 72 73 65 2c 20 6e 56 65 63 74 6f 72 2c 20 31 29  rse, nVector, 1)
16cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16cd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16ce0 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
16cf0 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
16d00 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
16d10 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
16d20 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
16d30 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 73  *.** Expressions
16d40 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
16d50 74 20 61 72 65 20 74 68 65 20 6c 65 66 74 20 61  t are the left a
16d60 6e 64 20 72 69 67 68 74 20 73 69 64 65 73 20 6f  nd right sides o
16d70 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  f a comparison.*
16d80 2a 20 6f 70 65 72 61 74 6f 72 2e 20 49 66 20 65  * operator. If e
16d90 69 74 68 65 72 20 70 4c 65 66 74 20 6f 72 20 70  ither pLeft or p
16da0 52 69 67 68 74 20 69 73 20 61 20 76 65 63 74 6f  Right is a vecto
16db0 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  r and the other 
16dc0 69 73 20 6e 6f 74 2c 20 6f 72 0a 2a 2a 20 69 66  is not, or.** if
16dd0 20 74 68 65 79 20 61 72 65 20 62 6f 74 68 20 76   they are both v
16de0 65 63 74 6f 72 73 20 62 75 74 20 6f 66 20 61 20  ectors but of a 
16df0 64 69 66 66 65 72 65 6e 74 20 73 69 7a 65 2c 20  different size, 
16e00 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
16e10 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65  essage.** in the
16e20 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 61 6e   Parse object an
16e30 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
16e40 6f 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  o. Or, if there 
16e50 69 73 20 6e 6f 20 70 72 6f 62 6c 65 6d 2c 20 0a  is no problem, .
16e60 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ** return 0..*/.
16e70 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
16e80 68 65 63 6b 43 6f 6d 70 61 72 69 73 6f 6e 28 50  heckComparison(P
16e90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
16ea0 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
16eb0 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  *pRight){.  int 
16ec0 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  nLeft = sqlite3E
16ed0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
16ee0 65 66 74 29 3b 0a 20 20 69 6e 74 20 6e 52 69 67  eft);.  int nRig
16ef0 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
16f00 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68  VectorSize(pRigh
16f10 74 29 3b 0a 20 20 69 66 28 20 6e 4c 65 66 74 21  t);.  if( nLeft!
16f20 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 69  =nRight ){.    i
16f30 66 28 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  f( (pRight->flag
16f40 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
16f50 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
16f60 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
16f70 28 70 50 61 72 73 65 2c 20 6e 52 69 67 68 74 2c  (pParse, nRight,
16f80 20 6e 4c 65 66 74 29 3b 0a 20 20 20 20 7d 65 6c   nLeft);.    }el
16f90 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c  se if( pLeft->fl
16fa0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
16fb0 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
16fc0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
16fd0 72 28 70 50 61 72 73 65 2c 20 6e 4c 65 66 74 2c  r(pParse, nLeft,
16fe0 20 6e 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65   nRight);.    }e
16ff0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
17000 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17010 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
17020 73 75 73 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20  sused");.    }. 
17030 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
17040 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17060 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
17070 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
17080 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
17090 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
170a0 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
170b0 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
170c0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
170d0 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
170e0 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
170f0 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
17100 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72 65 73  or vector expres
17110 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72  sion.  The .** r
17120 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
17130 52 48 53 29 20 69 73 20 61 6e 20 61 72 72 61 79  RHS) is an array
17140 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
17150 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20   scalar values, 
17160 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  or a.** subquery
17170 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
17180 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
17190 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
171a0 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a  t columns must.*
171b0 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  * match the numb
171c0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
171d0 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
171e0 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20  he LHS.  If the 
171f0 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74  RHS is.** a list
17200 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20   of values, the 
17210 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 63  LHS must be a sc
17220 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  alar. .**.** The
17230 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
17240 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
17250 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e  value is contain
17260 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
17270 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  S..** The result
17280 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
17290 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74 65   LHS is definite
172a0 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48  ly not in the RH
172b0 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75  S.  The .** resu
172c0 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
172d0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68  e presence of th
172e0 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53  e LHS in the RHS
172f0 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64   cannot be .** d
17300 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f  etermined due to
17310 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   NULLs..**.** Th
17320 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
17330 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
17340 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
17350 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
17360 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
17370 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
17380 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
17390 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
173a0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
173b0 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
173c0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
173d0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
173e0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
173f0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
17400 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
17410 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
17420 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ough..**.** See 
17430 74 68 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d  the separate in-
17440 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75  operator.md docu
17450 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69  mentation file i
17460 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a  n the canonical.
17470 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65  ** SQLite source
17480 20 74 72 65 65 20 66 6f 72 20 61 64 64 69 74 69   tree for additi
17490 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
174a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
174b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
174c0 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
174d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
174e0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
174f0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
17500 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
17510 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
17520 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
17530 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
17540 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
17550 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
17560 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
17570 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
17580 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
17590 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
175a0 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
175b0 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
175c0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
175d0 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
175e0 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
175f0 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
17600 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
17610 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
17620 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
17630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17640 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
17650 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20  /.  int rLhs;   
17660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
17670 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67  ister(s) holding
17680 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20   the LHS values 
17690 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69  */.  int rLhsOri
176a0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48  g;         /* LH
176b0 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74  S values prior t
176c0 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20  o reordering by 
176d0 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62  aiMap[] */.  Vdb
176e0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
176f0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
17700 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17710 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d  on */.  int *aiM
17720 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ap = 0;       /*
17730 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72   Map from vector
17740 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20   field to index 
17750 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
17760 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20   *zAff = 0;     
17770 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
17780 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69  ring for compari
17790 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  sons */.  int nV
177a0 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
177b0 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
177c0 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rs for this IN o
177d0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
177e0 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
177f0 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
17800 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
17810 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
17820 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
17830 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
17840 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17850 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  or */.  int i;  
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17870 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
17880 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 32  .  int destStep2
17890 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
178a0 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e  e to jump when N
178b0 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65  ULLs seen in ste
178c0 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  p 2 */.  int des
178d0 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f  tStep6 = 0;    /
178e0 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20  * Start of code 
178f0 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20  for Step 6 */.  
17900 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b  int addrTruthOp;
17910 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17920 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20   of opcode that 
17930 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49  determines the I
17940 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
17950 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20  nt destNotNull; 
17960 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
17970 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e if a compariso
17980 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e  n is not true in
17990 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   step 6 */.  int
179a0 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
179b0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
179c0 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20   step-6 loop */ 
179d0 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70  ..  pLeft = pExp
179e0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20  r->pLeft;.  if( 
179f0 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
17a00 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
17a10 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41  ) ) return;.  zA
17a20 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  ff = exprINAffin
17a30 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
17a40 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20  r);.  nVector = 
17a50 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
17a60 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
17a70 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28  ft);.  aiMap = (
17a80 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  int*)sqlite3DbMa
17a90 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20  llocZero(.      
17aa0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63  pParse->db, nVec
17ab0 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29  tor*(sizeof(int)
17ac0 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29   + sizeof(char))
17ad0 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20   + 1.  );.  if( 
17ae0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17af0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
17b00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
17b10 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20  N_oom_error;..  
17b20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
17b30 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41  mpute the RHS. A
17b40 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
17b50 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  if anything othe
17b60 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49  r than.  ** IN_I
17b70 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
17b80 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65  urned, the table
17b90 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73   opened ith curs
17ba0 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  or pExpr->iTable
17bb0 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   .  ** contains 
17bc0 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
17bd0 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
17be0 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
17bf0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
17c00 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
17c10 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
17c20 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
17c30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
17c40 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
17c50 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
17c60 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
17c70 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
17c80 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
17c90 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
17ca0 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
17cb0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
17cc0 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
17cd0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
17d00 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
17d10 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
17d40 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
17d50 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
17d60 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65   aiMap);..  asse
17d70 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
17d80 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c   || nVector==1 |
17d90 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
17da0 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20  X_EPH.       || 
17db0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
17dc0 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79  INDEX_ASC || eTy
17dd0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
17de0 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69  EX_DESC .  );.#i
17df0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
17e00 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74  G.  /* Confirm t
17e10 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74  hat aiMap[] cont
17e20 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74  ains nVector int
17e30 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77  eger values betw
17e40 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e  een 0 and.  ** n
17e50 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66  Vector-1. */.  f
17e60 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
17e70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
17e80 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72   j, cnt;.    for
17e90 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63  (cnt=j=0; j<nVec
17ea0 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69  tor; j++) if( ai
17eb0 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b  Map[j]==i ) cnt+
17ec0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  +;.    assert( c
17ed0 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e  nt==1 );.  }.#en
17ee0 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  dif..  /* Code t
17ef0 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
17f00 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
17f10 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68  IN (...)". If th
17f20 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a  e LHS is a .  **
17f30 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74   vector, then it
17f40 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
17f50 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f   array of nVecto
17f60 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  r registers star
17f70 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31  ting .  ** at r1
17f80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69  ..  **.  ** sqli
17f90 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
17fa0 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72   might have reor
17fb0 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73  dered the fields
17fc0 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74   of the LHS vect
17fd0 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  or.  ** so that 
17fe0 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69  the fields are i
17ff0 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
18000 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   as an existing 
18010 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a  index.   The.  *
18020 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20  * aiMap[] array 
18030 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69  contains a mappi
18040 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ng from the orig
18050 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f  inal LHS field o
18060 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  rder to.  ** the
18070 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61   field order tha
18080 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48  t matches the RH
18090 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  S index..  */.  
180a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
180b0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
180c0 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43  rLhsOrig = exprC
180d0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
180e0 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79  , pLeft, &iDummy
180f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
18100 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70  nVector && aiMap
18110 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f  [i]==i; i++){} /
18120 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73  * Are LHS fields
18130 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20   reordered? */. 
18140 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20   if( i==nVector 
18150 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69  ){.    /* LHS fi
18160 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f  elds are not reo
18170 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c  rdered */.    rL
18180 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20  hs = rLhsOrig;. 
18190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
181a0 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74  eed to reorder t
181b0 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63  he LHS fields ac
181c0 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70  cording to aiMap
181d0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73   */.    rLhs = s
181e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
181f0 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
18200 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
18210 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
18220 29 7b 0a 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 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b  _Copy, rLhsOrig+
18250 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d  i, rLhs+aiMap[i]
18260 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
18270 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
18280 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
18290 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
182a0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
182b0 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
182c0 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
182d0 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
182e0 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
182f0 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
18300 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
18310 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  risons..  **.  *
18320 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28  * This is step (
18330 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65  1) in the in-ope
18340 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a  rator.md optimiz
18350 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ed algorithm..  
18360 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
18370 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
18380 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
18390 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
183a0 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
183b0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
183c0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
183d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
183e0 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
183f0 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
18400 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18410 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67  .    int r2, reg
18420 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20  ToFree;.    int 
18430 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20  regCkNull = 0;. 
18440 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61     int ii;.    a
18450 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18460 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18470 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18480 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
18490 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
184a0 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
184b0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
184c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
184d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
184e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
184f0 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73  tAnd, rLhs, rLhs
18500 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
18510 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
18520 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
18530 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
18540 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
18550 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18560 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
18570 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
18580 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
18590 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
185a0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
185b0 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
185c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
185d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
185e0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
185f0 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
18600 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
18610 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
18620 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
18630 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
18640 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
18650 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18660 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c  Op4(v, OP_Eq, rL
18670 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c  hs, labelOk, r2,
18680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18690 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
186a0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
186b0 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64  SEQ);.        Vd
186c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
186d0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
186e0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
186f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
18700 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  ==pList->nExpr-1
18710 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18720 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
18730 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20  , zAff[0]);.    
18740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18750 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
18760 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
18770 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
18780 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
18790 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65   OP_Ne, rLhs, de
187a0 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187c0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
187d0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
187e0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
187f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
18800 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
18810 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51  (v, zAff[0] | SQ
18820 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
18830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18840 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18850 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18860 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  gToFree);.    }.
18870 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
18880 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
18890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
188a0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b  OP_IsNull, regCk
188b0 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
188c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
188d0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
188e0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
188f0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
18900 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18910 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18920 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
18930 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18940 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
18950 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f  kNull);.    goto
18960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18970 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  IN_finished;.  }
18980 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43  ..  /* Step 2: C
18990 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
189a0 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20  he LHS contains 
189b0 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  any NULL columns
189c0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c  .  If the.  ** L
189d0 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  HS does contain 
189e0 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72  NULLs then the r
189f0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69  esult must be ei
18a00 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55  ther FALSE or NU
18a10 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  LL..  ** We will
18a20 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62   then skip the b
18a30 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 20  inary search of 
18a40 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
18a50 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
18a60 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
18a70 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
18a80 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65  estIfFalse;.  }e
18a90 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65  lse{.    destSte
18aa0 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d  p2 = destStep6 =
18ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18ac0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20  Label(v);.  }.  
18ad0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18ae0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
18af0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
18b00 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
18b10 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
18b20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
18b30 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
18b40 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
18b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18b60 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68  , OP_IsNull, rLh
18b70 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b  s+i, destStep2);
18b80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
18b90 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
18ba0 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20  }..  /* Step 3. 
18bb0 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20   The LHS is now 
18bc0 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
18bd0 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69  NULL.  Do the bi
18be0 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a  nary search.  **
18bf0 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e   of the RHS usin
18c00 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70  g the LHS as a p
18c10 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  robe.  If found,
18c20 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20   the result is. 
18c30 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   ** true..  */. 
18c40 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
18c50 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
18c60 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
18c70 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
18c80 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
18c90 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77   b-tree and so w
18ca0 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e  e also.    ** kn
18cb0 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ow that the RHS 
18cc0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65  is non-NULL.  He
18cd0 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20  nce, we combine 
18ce0 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20  steps 3 and 4.  
18cf0 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67    ** into a sing
18d00 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  le opcode. */.  
18d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18d20 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
18d30 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
18d40 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
18d50 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65   rLhs);.    Vdbe
18d60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18d70 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
18d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
18d90 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f  (v, OP_Goto);  /
18da0 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f  * Return True */
18db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
18dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18dd0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
18de0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30  rLhs, nVector, 0
18df0 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29  , zAff, nVector)
18e00 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
18e10 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
18e20 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  l ){.      /* Co
18e30 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64  mbine Step 3 and
18e40 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73   Step 5 into a s
18e50 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  ingle opcode */.
18e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18e70 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18e80 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
18e90 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
18ea0 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20  False,.         
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
18ed0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18ee0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71  );.      goto sq
18ef0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
18f00 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
18f10 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20      /* Ordinary 
18f20 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20  Step 3, for the 
18f30 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45  case where FALSE
18f40 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69   and NULL are di
18f50 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64  stinct */.    ad
18f60 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
18f70 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
18f80 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
18f90 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a  xpr->iTable, 0,.
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
18fd0 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
18fe0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
18ff0 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
19000 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
19010 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
19020 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
19030 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
19040 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
19050 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
19060 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
19070 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
19080 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
19090 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
190a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
190b0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
190c0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
190d0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
190e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
190f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
19100 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
19110 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
19120 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
19130 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
19140 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
19150 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
19160 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
19170 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
19180 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
19190 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
191a0 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
191b0 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
191c0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
191d0 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
191e0 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
191f0 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
19200 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
19210 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19220 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
19230 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
19240 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
19250 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
19260 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
19270 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
19280 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
19290 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
192a0 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
192b0 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
192c0 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
192d0 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
192e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
192f0 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
19300 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
19310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19320 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
19330 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
19340 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56  estIfFalse);.  V
19350 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19360 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
19370 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  ){.    destNotNu
19380 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
19390 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
193a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
193b0 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
193c0 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
193d0 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
193e0 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
193f0 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
19400 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
19410 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
19420 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
19430 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
19440 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
19450 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
19460 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
19470 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
19480 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
19490 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
194a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
194b0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
194c0 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
194d0 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
194e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
194f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
19500 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19510 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
19520 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
19530 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  le, i, r3);.    
19540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19550 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
19560 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
19570 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
19580 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
19590 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
195a0 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
195b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
195c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
195d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
195e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
195f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19600 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
19610 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
19620 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
19630 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19640 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
19650 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
19660 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19670 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69  P_Next, pExpr->i
19680 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31  Table, addrTop+1
19690 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
196a0 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
196b0 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72  Step 7:  If we r
196c0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
196d0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
196e0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20  e result must.  
196f0 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a    ** be false. *
19700 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
19710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19720 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
19730 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  se);.  }..  /* J
19740 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64  umps here in ord
19750 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75  er to return tru
19760 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
19770 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
19780 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71  ddrTruthOp);..sq
19790 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
197a0 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
197b0 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29  rLhs!=rLhsOrig )
197c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
197d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
197e0 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Lhs);.  sqlite3E
197f0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
19800 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  se);.  VdbeComme
19810 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
19820 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45  xpr"));.sqlite3E
19830 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
19840 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
19850 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
19860 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74   aiMap);.  sqlit
19870 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
19880 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65  >db, zAff);.}.#e
19890 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
198a0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
198b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
198c0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
198d0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
198e0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
198f0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
19900 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
19910 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
19920 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
19930 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
19940 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
19950 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
19960 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
19970 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
19980 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
19990 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
199a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
199b0 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
199c0 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
199d0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
199e0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
199f0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
19a00 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
19a10 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
19a20 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
19a30 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
19a40 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
19a50 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
19a60 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  le value;.    sq
19a70 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
19a80 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
19a90 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
19aa0 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
19ab0 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
19ac0 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
19ad0 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
19ae0 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
19af0 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
19b00 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
19b10 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
19b20 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
19b30 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
19b40 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
19b50 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  ue, P4_REAL);.  
19b60 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
19b70 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
19b80 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
19b90 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
19ba0 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
19bb0 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
19bc0 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
19bd0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
19be0 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
19bf0 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
19c00 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
19c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
19c20 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
19c30 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
19c40 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
19c50 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
19c60 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
19c70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
19c80 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
19c90 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
19ca0 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
19cb0 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
19cc0 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
19cd0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
19ce0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
19cf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19d00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
19d10 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
19d20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
19d30 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
19d40 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
19d50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
19d60 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
19d70 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
19d80 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
19d90 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
19da0 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d  if( c==0 || (c==
19db0 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b  2 && negFlag) ){
19dc0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
19dd0 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
19de0 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =2 ? SMALLEST_IN
19df0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
19e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e10 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
19e20 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
19e30 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
19e40 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
19e50 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
19e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
19e70 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
19e80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19e90 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
19ea0 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
19eb0 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
19ec0 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
19ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19ee0 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
19ef0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
19f00 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
19f10 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
19f20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19f30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
19f40 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
19f50 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
19f60 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
19f70 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
19f80 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
19f90 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
19fa0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
19fb0 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  }.  }.}..#if def
19fc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
19fd0 47 29 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  G)./*.** Verify 
19fe0 74 68 65 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  the consistency 
19ff0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
1a000 63 68 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  che.*/.static in
1a010 74 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 50  t cacheIsValid(P
1a020 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1a030 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72   int i, n;.  for
1a040 28 69 3d 6e 3d 30 3b 20 69 3c 53 51 4c 49 54 45  (i=n=0; i<SQLITE
1a050 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1a060 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
1a070 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1a080 69 52 65 67 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20  iReg>0 ) n++;.  
1a090 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 70 50  }.  return n==pP
1a0a0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1a0b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a0c0 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65   Clear a cache e
1a0d0 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
1a0e0 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43  void cacheEntryC
1a0f0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
1a100 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43  se, struct yColC
1a110 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  ache *p){.  if( 
1a120 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20  p->tempReg ){.  
1a130 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1a140 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
1a150 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
1a160 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  g) ){.      pPar
1a170 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1a180 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1a190 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
1a1a0 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  }.    p->tempReg
1a1b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69   = 0;.  }.  p->i
1a1c0 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
1a1d0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  e->nColCache--;.
1a1e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1a1f0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1a200 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56 61 6c  ed || cacheIsVal
1a210 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a 7d 0a  id(pParse) );.}.
1a220 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
1a230 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
1a240 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
1a250 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
1a260 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
1a270 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
1a280 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
1a290 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
1a2a0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1a2b0 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
1a2c0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
1a2d0 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
1a2e0 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
1a2f0 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
1a300 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
1a310 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1a320 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  p;..  /* Unless 
1a330 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a340 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72 20  urred, register 
1a350 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
1a360 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a  ys positive. */.
1a370 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
1a380 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a390 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a3a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a3b0 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
1a3c0 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
1a3d0 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
1a3e0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
1a3f0 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
1a400 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
1a410 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
1a420 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
1a430 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
1a440 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
1a450 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
1a460 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
1a470 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
1a480 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
1a490 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
1a4a0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
1a4b0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1a4c0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
1a4d0 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
1a4e0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20  _ColumnCache) ) 
1a4f0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
1a500 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
1a510 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
1a520 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
1a530 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
1a540 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
1a550 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
1a560 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
1a570 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
1a580 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
1a590 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
1a5a0 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
1a5b0 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
1a5c0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
1a5d0 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
1a5e0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a5f0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1a600 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1a610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a620 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e  ->iReg==0 || p->
1a630 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
1a640 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
1a650 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1a660 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70    /* Find an emp
1a670 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c  ty slot and repl
1a680 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28  ace it */.  for(
1a690 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1a6a0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1a6b0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1a6c0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1a6d0 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a  ( p->iReg==0 ){.
1a6e0 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20        p->iLevel 
1a6f0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1a700 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  Level;.      p->
1a710 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
1a720 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20       p->iColumn 
1a730 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  = iCol;.      p-
1a740 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
1a750 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1a760 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   0;.      p->lru
1a770 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1a780 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 70 50  eCnt++;.      pP
1a790 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b  arse->nColCache+
1a7a0 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
1a7b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a7c0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 63 61 63  locFailed || cac
1a7d0 68 65 49 73 56 61 6c 69 64 28 70 50 61 72 73 65  heIsValid(pParse
1a7e0 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ) );.      retur
1a7f0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
1a800 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
1a810 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
1a820 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
1a830 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
1a840 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
1a850 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a860 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a870 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a880 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1a890 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
1a8a0 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
1a8b0 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
1a8c0 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
1a8d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
1a8e0 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
1a8f0 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
1a900 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1a910 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
1a920 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
1a930 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
1a940 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
1a950 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
1a960 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
1a970 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
1a980 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1a990 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
1a9a0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1a9b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 61  ;.    assert( ca
1a9c0 63 68 65 49 73 56 61 6c 69 64 28 70 50 61 72 73  cheIsValid(pPars
1a9d0 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e) );.    return
1a9e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1a9f0 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
1aa00 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
1aa10 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
1aa20 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
1aa30 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
1aa40 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
1aa50 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
1aa60 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1aa70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1aa80 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
1aa90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1aaa0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1aab0 7b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  {.  struct yColC
1aac0 61 63 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 69  ache *p;.  if( i
1aad0 52 65 67 3c 3d 30 20 7c 7c 20 70 50 61 72 73 65  Reg<=0 || pParse
1aae0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  ->nColCache==0 )
1aaf0 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 26   return;.  p = &
1ab00 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1ab10 65 5b 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  e[SQLITE_N_COLCA
1ab20 43 48 45 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28  CHE-1];.  while(
1ab30 31 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  1){.    if( p->i
1ab40 52 65 67 20 3e 3d 20 69 52 65 67 20 26 26 20 70  Reg >= iReg && p
1ab50 2d 3e 69 52 65 67 20 3c 20 69 52 65 67 2b 6e 52  ->iReg < iReg+nR
1ab60 65 67 20 29 20 63 61 63 68 65 45 6e 74 72 79 43  eg ) cacheEntryC
1ab70 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
1ab80 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 50 61 72  .    if( p==pPar
1ab90 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 29 20  se->aColCache ) 
1aba0 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a  break;.    p--;.
1abb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
1abc0 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
1abd0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
1abe0 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
1abf0 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
1ac00 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
1ac10 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
1ac20 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
1ac30 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
1ac40 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
1ac50 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
1ac60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ac70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
1ac80 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
1ac90 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1aca0 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
1acb0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1acc0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1acd0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1ace0 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1acf0 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25  rintf("PUSH to %
1ad00 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1ad10 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1ad20 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1ad30 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
1ad40 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
1ad50 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
1ad60 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
1ad70 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
1ad80 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  us sqlite3ExprCa
1ad90 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f  chePush operatio
1ada0 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
1adb0 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74  ds, restore.** t
1adc0 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20  he cache to the 
1add0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1ade0 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  prior the most r
1adf0 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76  ecent Push..*/.v
1ae00 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ae10 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
1ae20 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1ae30 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1ae40 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  che *p;.  assert
1ae50 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1ae60 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50  Level>=1 );.  pP
1ae70 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1ae80 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l--;.#ifdef SQLI
1ae90 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1aea0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1aeb0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1aec0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1aed0 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20  printf("POP  to 
1aee0 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1aef0 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1af00 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1af10 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1af20 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1af30 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1af40 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1af50 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c  p->iReg && p->iL
1af60 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
1af70 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
1af80 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1af90 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
1afa0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1afb0 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63   When a cached c
1afc0 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c  olumn is reused,
1afd0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1afe0 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a  its register is.
1aff0 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61  ** no longer ava
1b000 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70  ilable as a temp
1b010 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b   register.  tick
1b020 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20  et #3879:  that 
1b030 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72  same.** register
1b040 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65   might be in the
1b050 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70   cache in multip
1b060 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65  le places, so be
1b070 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20   sure to.** get 
1b080 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  them all..*/.sta
1b090 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1b0a0 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
1b0b0 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  ster(Parse *pPar
1b0c0 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
1b0d0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1b0e0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1b0f0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1b100 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1b110 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1b120 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1b130 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
1b140 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  iReg ){.      p-
1b150 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
1b160 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65    }.  }.}../* Ge
1b170 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1b180 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20   will load into 
1b190 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20  register regOut 
1b1a0 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a  a value that is.
1b1b0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
1b1c0 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74  or the iIdxCol-t
1b1d0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
1b1e0 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20  x pIdx..*/.void 
1b1f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
1b200 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a  oadIndexColumn(.
1b210 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1b220 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1b230 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1b240 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a  dex *pIdx,    /*
1b250 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1b260 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65   column is to be
1b270 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1b280 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1b290 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1b2a0 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a  to a table row *
1b2b0 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c  /.  int iIdxCol,
1b2c0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1b2d0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  n of the index t
1b2e0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1b2f0 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1b300 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e   /* Store the in
1b310 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  dex column value
1b320 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1b330 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54  r */.){.  i16 iT
1b340 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69  abCol = pIdx->ai
1b350 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b  Column[iIdxCol];
1b360 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d  .  if( iTabCol==
1b370 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61  XN_EXPR ){.    a
1b380 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1b390 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  lExpr );.    ass
1b3a0 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1b3b0 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43  xpr->nExpr>iIdxC
1b3c0 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ol );.    pParse
1b3d0 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61  ->iSelfTab = iTa
1b3e0 62 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  bCur;.    sqlite
1b3f0 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50  3ExprCodeCopy(pP
1b400 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c  arse, pIdx->aCol
1b410 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d  Expr->a[iIdxCol]
1b420 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b  .pExpr, regOut);
1b430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b450 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50  ColumnOfTable(pP
1b460 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64  arse->pVdbe, pId
1b470 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43  x->pTable, iTabC
1b480 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c          iTabCol,
1b4b0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1b4c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b4d0 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
1b4e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1b4f0 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
1b500 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
1b510 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b520 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1b530 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
1b540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1b550 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
1b560 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
1b570 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
1b580 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1b590 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
1b5a0 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1b5b0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1b5c0 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50  ursor.  Or the P
1b5d0 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54  K cursor for WIT
1b5e0 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
1b5f0 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
1b600 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1b610 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
1b620 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
1b630 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
1b640 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  t the value into
1b650 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1b660 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c  /.){.  if( iCol<
1b670 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
1b680 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
1b690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b6a0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1b6b0 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
1b6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1b6d0 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
1b6e0 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
1b6f0 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
1b700 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b     int x = iCol;
1b710 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
1b720 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56  id(pTab) && !IsV
1b730 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1b740 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
1b750 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
1b760 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1b770 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
1b780 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
1b790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b7a0 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
1b7b0 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
1b7c0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
1b7d0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
1b7e0 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
1b7f0 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
1b800 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1b810 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1b820 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
1b830 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
1b840 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
1b850 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
1b860 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1b870 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
1b880 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f  . .**.** An effo
1b890 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  rt is made to st
1b8a0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1b8b0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1b8c0 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20   iReg.  This.** 
1b8d0 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65  is not garanteee
1b8e0 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28  d for GetColumn(
1b8f0 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63  ) - the result c
1b900 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
1b910 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e  ** any register.
1b920 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c 74    But the result
1b930 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1b940 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74  o land in regist
1b950 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47  er iReg.** for G
1b960 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e  etColumnToReg().
1b970 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1b980 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1b990 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
1b9a0 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
1b9b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1b9c0 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
1b9d0 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
1b9e0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
1b9f0 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
1ba00 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
1ba10 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1ba20 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1ba30 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1ba40 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1ba50 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1ba60 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1ba70 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1ba80 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1ba90 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1baa0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1bab0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1bac0 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1bad0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1bae0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1baf0 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1bb00 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1bb10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
1bb20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1bb30 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1bb40 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
1bb50 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
1bb60 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
1bb70 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
1bb80 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1bb90 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1bba0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1bbb0 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
1bbc0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1bbd0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1bbe0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1bbf0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1bc00 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e  p->iReg>0 && p->
1bc10 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
1bc20 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
1bc30 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70  olumn ){.      p
1bc40 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
1bc50 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
1bc60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1bc70 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
1bc80 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
1bc90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
1bca0 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
1bcb0 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
1bcc0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
1bcd0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1bce0 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
1bcf0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
1bd00 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35   iReg);.  if( p5
1bd10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1bd20 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
1bd30 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a  5);.  }else{   .
1bd40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bd50 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1bd60 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1bd70 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
1bd80 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76  return iReg;.}.v
1bd90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1bda0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  odeGetColumnToRe
1bdb0 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  g(.  Parse *pPar
1bdc0 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
1bdd0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1bde0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1bdf0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1be00 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1be10 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
1be20 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
1be30 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
1be40 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
1be50 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
1be60 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
1be70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1be80 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
1be90 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
1bea0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
1beb0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
1bec0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
1bed0 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
1bee0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1bef0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
1bf00 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  ab, iColumn, iTa
1bf10 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20  ble, iReg, 0);. 
1bf20 20 69 66 28 20 72 31 21 3d 69 52 65 67 20 29 20   if( r1!=iReg ) 
1bf30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bf40 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1bf50 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69   OP_SCopy, r1, i
1bf60 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Reg);.}.../*.** 
1bf70 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
1bf80 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
1bf90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bfa0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
1bfb0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1bfc0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1bfd0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23  yColCache *p;..#
1bfe0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1bff0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1c000 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1c010 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1c020 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
1c030 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
1c040 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
1c050 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1c060 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1c070 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1c080 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1c090 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
1c0a0 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1c0b0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
1c0c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
1c0d0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1c0e0 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
1c0f0 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
1c100 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
1c110 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
1c120 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
1c130 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c140 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1c150 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
1c160 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
1c170 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
1c180 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c190 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
1c1a0 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a  Start, iCount);.
1c1b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c1c0 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
1c1d0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
1c1e0 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
1c1f0 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
1c200 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
1c210 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
1c220 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
1c230 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
1c240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c250 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
1c260 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1c270 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
1c280 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  ){.  assert( iFr
1c290 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
1c2a0 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
1c2b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1c2c0 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
1c2d0 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
1c2e0 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
1c2f0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1c300 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1c310 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b  e, iFrom, nReg);
1c320 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1c330 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1c340 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c350 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
1c360 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1c370 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
1c380 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
1c390 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
1c3a0 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
1c3b0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
1c3c0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  olumn cache..**.
1c3d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c3e0 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
1c3f0 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74  ssert() and test
1c400 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e  case() macros on
1c410 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e  ly.** and does n
1c420 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e  ot appear in a n
1c430 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ormal build..*/.
1c440 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
1c450 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
1c460 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1c470 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
1c480 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1c490 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1c4a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1c4b0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1c4c0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1c4d0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1c4e0 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
1c4f0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
1c500 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
1c510 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20   ) return 1;    
1c520 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a  /*NO_TEST*/.  }.
1c530 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c540 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
1c550 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43  EBUG || SQLITE_C
1c560 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a  OVERAGE_TEST */.
1c570 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1c580 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1c590 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b  ion node to a TK
1c5a0 5f 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65  _REGISTER refere
1c5b0 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65  ncing.** registe
1c5c0 72 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c  r iReg.  The cal
1c5d0 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
1c5e0 74 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64  that iReg alread
1c5f0 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
1c600 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1c610 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
1c620 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1c630 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  id exprToRegiste
1c640 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
1c650 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d  Reg){.  p->op2 =
1c660 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20   p->op;.  p->op 
1c670 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1c680 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65   p->iTable = iRe
1c690 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72  g;.  ExprClearPr
1c6a0 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69  operty(p, EP_Ski
1c6b0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61  p);.}../*.** Eva
1c6c0 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
1c6d0 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65  ion (either a ve
1c6e0 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72  ctor or a scalar
1c6f0 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64   expression) and
1c700 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65   store.** the re
1c710 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75  sult in contingu
1c720 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  ous temporary re
1c730 67 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e  gisters.  Return
1c740 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
1c750 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
1c760 74 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ter used to stor
1c770 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  e the result..**
1c780 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72  .** If the retur
1c790 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73  ned result regis
1c7a0 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
1c7b0 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20  ry scalar, then 
1c7c0 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68  also write.** th
1c7d0 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
1c7e0 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61  er into *piFreea
1c7f0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74  ble.  If the ret
1c800 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67  urned result reg
1c810 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20  ister.** is not 
1c820 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
1c830 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1c840 20 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74   is a vector set
1c850 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20   *piFreeable.** 
1c860 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
1c870 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74  int exprCodeVect
1c880 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1c890 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  , Expr *p, int *
1c8a0 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69  piFreeable){.  i
1c8b0 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e  nt iResult;.  in
1c8c0 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69  t nResult = sqli
1c8d0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
1c8e0 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73  e(p);.  if( nRes
1c8f0 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52  ult==1 ){.    iR
1c900 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1c910 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1c920 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c  se, p, piFreeabl
1c930 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1c940 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30   *piFreeable = 0
1c950 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
1c960 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
1c970 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1c980 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1c990 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c  ct(pParse, p, 0,
1c9a0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c9b0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1c9c0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61     iResult = pPa
1c9d0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1c9e0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1c9f0 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20  += nResult;.    
1ca00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
1ca10 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sult; i++){.    
1ca20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ca30 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78  ode(pParse, p->x
1ca40 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
1ca50 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a  pr, i+iResult);.
1ca60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ca70 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75  }.  return iResu
1ca80 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  lt;.}.../*.** Ge
1ca90 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
1caa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
1cab0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cac0 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1cad0 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
1cae0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1caf0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1cb00 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
1cb10 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1cb20 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
1cb30 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
1cb40 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
1cb50 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
1cb60 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1cb70 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
1cb80 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
1cb90 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1cba0 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
1cbb0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
1cbc0 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
1cbd0 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
1cbe0 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
1cbf0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
1cc00 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
1cc10 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
1cc20 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
1cc30 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
1cc40 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
1cc50 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1cc60 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
1cc70 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1cc80 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1cc90 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1cca0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
1ccb0 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
1ccc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1ccd0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ccf0 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
1cd00 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
1cd10 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
1cd20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
1cd30 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
1cd40 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
1cd50 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1cd60 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1cd70 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1cd80 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1cd90 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
1cda0 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
1cdb0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1cdc0 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1cdd0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1cde0 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20  /.  int r1, r2; 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce00 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
1ce10 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73  r numbers */.  s
1ce20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1ce30 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
1ce40 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1ce50 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65  ion */.  Expr te
1ce60 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  mpX;            
1ce70 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
1ce80 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1ce90 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b  */.  int p5 = 0;
1cea0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1ceb0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
1cec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
1ced0 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
1cee0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1cef0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1cf00 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
1cf10 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
1cf20 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1cf30 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1cf40 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1cf50 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1cf60 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1cf70 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1cf80 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1cf90 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1cfa0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1cfb0 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1cfc0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1cfd0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1cfe0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1cff0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1d000 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1d010 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1d020 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1d030 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
1d040 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
1d050 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1d060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d070 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1d080 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1d090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d0a0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1d0b0 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1d0c0 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1d0f0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1d100 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1d110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1d120 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
1d130 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
1d140 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
1d150 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
1d160 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1d170 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
1d180 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Tab = pExpr->iTa
1d190 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ble;.      if( i
1d1a0 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
1d1b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42   if( pParse->ckB
1d1c0 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ase>0 ){.       
1d1d0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67     /* Generating
1d1e0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
1d1f0 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  ts or inserting 
1d200 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64  into partial ind
1d210 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
1d220 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
1d230 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d  Column + pParse-
1d240 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20  >ckBase;.       
1d250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d270 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1d280 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1d290 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1d2a0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1d2b0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1d2c0 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1d2d0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1d2e0 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1d2f0 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1d300 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1d310 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1d320 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
1d330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
1d340 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1d350 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1d360 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
1d370 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
1d3a0 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a  , iTab, target,.
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d3d0 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20  Expr->op2);.    
1d3e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d3f0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
1d400 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
1d410 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1d420 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
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 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1d450 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1d460 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
1d470 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
1d480 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d490 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1d4a0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1d4b0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
1d4c0 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
1d4d0 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
1d4e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1d4f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d500 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
1d510 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d520 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d530 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1d540 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
1d550 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
1d560 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
1d570 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1d580 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d590 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d5a0 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
1d5b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d5c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1d5d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
1d5e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1d5f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d600 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
1d610 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
1d620 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1d630 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d640 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
1d650 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
1d660 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1d670 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1d680 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1d690 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1d6a0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78  >u.zToken[0]=='x
1d6b0 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ' || pExpr->u.zT
1d6c0 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  oken[0]=='X' );.
1d6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1d6e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1d6f0 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1d700 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54  z = &pExpr->u.zT
1d710 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e  oken[2];.      n
1d720 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1d730 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20  30(z) - 1;.     
1d740 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27   assert( z[n]=='
1d750 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c  \'' );.      zBl
1d760 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
1d770 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
1d780 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
1d790 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d7a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
1d7b0 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
1d7c0 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
1d7d0 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  AMIC);.      bre
1d7e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1d7f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
1d800 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61  IABLE: {.      a
1d810 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d820 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1d830 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1d840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1d850 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20  pr->u.zToken!=0 
1d860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d870 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d880 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
1d890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8a0 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
1d8b0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1d8c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1d8d0 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54   if( pExpr->u.zT
1d8e0 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20  oken[1]!=0 ){.  
1d8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1d900 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1d910 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20  =='?' .         
1d920 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45      || strcmp(pE
1d930 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  xpr->u.zToken, p
1d940 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
1d950 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d  pr->iColumn-1])=
1d960 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
1d970 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1d980 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d  4(v, -1, pParse-
1d990 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
1d9a0 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41  olumn-1], P4_STA
1d9b0 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1d9c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d9d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1d9e0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  ISTER: {.      i
1d9f0 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54  nReg = pExpr->iT
1da00 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61  able;.      brea
1da10 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1da20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1da30 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
1da40 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
1da50 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1da60 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
1da70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
1da80 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  /.      inReg = 
1da90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1daa0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1dab0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
1dac0 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  et);.      if( i
1dad0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
1dae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1daf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1db00 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
1db10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
1db20 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
1db30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1db40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1db50 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65  , OP_Cast, targe
1db60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1db70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1db80 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
1db90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1dba0 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0));.      testc
1dbb0 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d  ase( usedAsColum
1dbc0 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
1dbd0 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a  nReg, inReg) );.
1dbe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dbf0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1dc00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ange(pParse, inR
1dc10 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  eg, 1);.      br
1dc20 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1dc30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1dc40 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1dc50 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1dc60 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1dc70 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1dc80 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1dc90 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1dca0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1dcb0 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1dcc0 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1dcd0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1dce0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1dcf0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1dd00 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1dd10 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1dd20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1dd30 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1dd40 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1dd50 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1dd60 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1dd70 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1dd80 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1dd90 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1dda0 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1ddb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ddc0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ddd0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1dde0 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1ddf0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1de00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1de10 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1de20 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1de30 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1de40 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1de50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1de60 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1de70 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1de80 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1de90 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1dea0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1deb0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1dec0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1ded0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1dee0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1def0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1df00 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1df10 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1df20 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1df30 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1df40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1df50 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1df60 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1df70 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1df80 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1df90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1dfa0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1dfb0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1dfc0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1dfd0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1dfe0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1dff0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1e000 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1e010 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1e020 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1e030 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e040 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1e050 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1e060 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e070 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1e080 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e090 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e0a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e0b0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e0c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e0d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e0e0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1e0f0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1e100 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1e110 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1e120 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1e130 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1e140 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1e150 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1e160 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1e170 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1e180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1e190 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1e1a0 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1e1b0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1e1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e1d0 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e1f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1e200 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e210 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1e230 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1e240 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1e250 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1e260 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1e270 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e280 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1e290 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1e2a0 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1e2b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e2c0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1e2d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1e2e0 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1e2f0 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e300 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1e310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e320 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1e330 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1e340 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1e350 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1e360 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1e370 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1e380 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e390 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1e3a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1e3b0 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1e3c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e3d0 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1e3e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e3f0 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1e400 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1e410 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1e420 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1e430 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1e440 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1e450 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e460 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1e470 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1e480 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1e490 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1e4a0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1e4b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e4c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e4d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e4e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e4f0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1e500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e510 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e520 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e530 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1e540 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e550 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1e560 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1e570 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e580 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1e590 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e5a0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e5b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e5c0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1e5d0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1e5e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1e5f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1e600 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1e610 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1e620 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1e630 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1e640 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1e650 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20  arget);.#ifndef 
1e660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1e670 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1e680 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
1e690 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1e6a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1e6b0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e6c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e6d0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e6e0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
1e6f0 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
1e700 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
1e710 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1e720 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
1e730 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
1e740 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
1e750 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
1e760 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
1e770 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
1e780 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
1e790 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e7a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e7b0 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
1e7c0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1e7d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1e7e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e7f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e800 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e820 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
1e830 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
1e840 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
1e850 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1e860 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1e870 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
1e880 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
1e890 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e8a0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
1e8b0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1e8c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1e8d0 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
1e8e0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1e8f0 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
1e900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e910 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
1e920 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1e930 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
1e940 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e950 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e960 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e970 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e980 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e990 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e9a0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
1e9b0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  arget;.      sql
1e9c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e9d0 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
1e9e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e9f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ea00 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1ea10 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1ea20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
1ea30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ea40 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1ea50 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1ea60 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1ea70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ea80 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1ea90 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1eaa0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1eab0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
1eac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ead0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1eae0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1eaf0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1eb00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1eb10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1eb20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1eb30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1eb40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1eb50 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1eb60 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
1eb70 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1eb80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1eb90 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1eba0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1ebb0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1ebc0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1ebd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ebe0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1ebf0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1ec00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1ec10 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1ec20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ec30 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1ec40 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1ec50 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
1ec60 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1ec70 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
1ec80 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1ec90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1eca0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ecb0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ecc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ecd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ece0 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
1ecf0 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
1ed00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1ed10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ed20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49        inReg = pI
1ed30 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
1ed40 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
1ed50 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ed60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ed70 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
1ed80 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1ed90 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
1eda0 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
1edb0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1edc0 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ede0 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
1edf0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1ee00 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
1ee10 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
1ee20 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
1ee30 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
1ee40 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1ee50 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a  r *zId;       /*
1ee60 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
1ee70 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20  me */.      u32 
1ee80 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20  constMask = 0;  
1ee90 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75     /* Mask of fu
1eea0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1eeb0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61   that are consta
1eec0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
1eed0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1eee0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1eef0 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  er */.      u8 e
1ef00 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
1ef10 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1ef20 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
1ef30 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1ef40 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1ef50 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
1ef60 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
1ef70 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
1ef80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ef90 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1efa0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1efb0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1efc0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1efd0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1efe0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1eff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1f000 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1f010 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1f020 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1f030 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
1f040 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
1f050 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
1f060 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1f070 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1f080 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
1f090 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
1f0a0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  oken;.      pDef
1f0b0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1f0c0 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
1f0d0 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1f0e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f0f0 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c  ABLE_UNKNOWN_SQL
1f100 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20  _FUNCTION.      
1f110 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70  if( pDef==0 && p
1f120 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
1f130 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
1f140 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1f150 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77  tion(db, "unknow
1f160 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  n", nFarg, enc, 
1f170 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
1f180 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
1f190 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46  f==0 || pDef->xF
1f1a0 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20  inalize!=0 ){.  
1f1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1f1c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1f1d0 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
1f1e0 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20   %s()", zId);.  
1f1f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f200 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
1f210 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
1f220 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1f230 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
1f240 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
1f250 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
1f260 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
1f270 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
1f280 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  ary evaluation o
1f290 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d  f.      ** argum
1f2a0 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69  ents past the fi
1f2b0 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  rst non-NULL arg
1f2c0 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
1f2d0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f2e0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f2f0 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
1f300 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1f310 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71  endCoalesce = sq
1f320 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f330 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61  el(v);.        a
1f340 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
1f350 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f360 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1f370 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
1f380 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1f390 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
1f3a0 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
1f3b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f3c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f3d0 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
1f3e0 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
1f3f0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1f400 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1f410 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f420 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1f430 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  se, target, 1);.
1f440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f450 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f460 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1f470 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f480 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
1f490 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[i].pExpr, tar
1f4a0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  get);.          
1f4b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f4c0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1f4d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1f4e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f4f0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
1f500 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1f510 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1f520 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
1f530 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
1f540 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
1f550 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
1f560 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
1f570 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
1f580 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1f590 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1f5a0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1f5b0 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
1f5c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1f5d0 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
1f5e0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73         inReg = s
1f5f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1f600 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61  rget(pParse, pFa
1f610 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
1f620 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f630 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1f640 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1f650 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
1f660 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
1f670 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1f680 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
1f690 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
1f6a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1f6b0 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20  e( i==31 );.    
1f6c0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
1f6d0 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b  |= MASKBIT32(i);
1f6e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f6f0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
1f700 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1f710 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
1f720 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
1f730 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
1f740 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1f750 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
1f760 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
1f770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f780 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
1f790 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rg ){.        if
1f7a0 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20  ( constMask ){. 
1f7b0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50           r1 = pP
1f7c0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1f7d0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1f7e0 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20  nMem += nFarg;. 
1f7f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f800 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1f810 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1f820 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
1f830 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f840 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74      /* For lengt
1f850 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
1f860 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
1f870 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e  a column argumen
1f880 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  t,.        ** se
1f890 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  t the P5 paramet
1f8a0 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c  er to the OP_Col
1f8b0 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  umn opcode to OP
1f8c0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20  FLAG_LENGTHARG. 
1f8d0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46         ** or OPF
1f8e0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65  LAG_TYPEOFARG re
1f8f0 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61  spectively, to a
1f900 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
1f910 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a   data.        **
1f920 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   loading..      
1f930 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1f940 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
1f950 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
1f960 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
1f970 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
1f980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
1f990 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
1f9a0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
1f9b0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
1f9c0 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
1f9d0 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
1f9e0 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
1f9f0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
1fa00 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
1fa10 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
1fa20 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
1fa30 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
1fa40 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
1fa50 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1fa60 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
1fa70 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
1fa80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
1fa90 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
1faa0 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
1fab0 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
1fac0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1fad0 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  se( pDef->funcFl
1fae0 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e  ags & OPFLAG_LEN
1faf0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
1fb00 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30        pFarg->a[0
1fb10 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a  ].pExpr->op2 = .
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
1fb40 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  s & (OPFLAG_LENG
1fb50 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
1fb60 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
1fb70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
1fb80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fb90 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1fba0 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63  rse);     /* Tic
1fbb0 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
1fbc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1fbd0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1fbe0 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  ist(pParse, pFar
1fbf0 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20  g, r1, 0,.      
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1fc20 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45  _ECEL_DUP|SQLITE
1fc30 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20  _ECEL_FACTOR);. 
1fc40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1fc50 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1fc60 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  e);      /* Tick
1fc70 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
1fc80 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
1fc90 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
1fca0 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
1fcb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1fcc0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
1fcd0 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
1fce0 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
1fcf0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
1fd00 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
1fd10 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
1fd20 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
1fd30 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1fd40 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
1fd50 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
1fd60 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
1fd70 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
1fd80 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
1fd90 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
1fda0 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
1fdb0 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
1fdc0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1fdd0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
1fde0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1fdf0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
1fe00 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
1fe10 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1fe20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
1fe30 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
1fe40 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
1fe50 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
1fe60 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
1fe70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1fe80 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
1fe90 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
1fea0 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
1feb0 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
1fec0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
1fed0 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
1fee0 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
1fef0 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
1ff00 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
1ff10 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
1ff20 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
1ff30 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
1ff40 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
1ff50 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
1ff60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
1ff70 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
1ff80 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
1ff90 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
1ffa0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1ffb0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
1ffc0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
1ffd0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
1ffe0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1fff0 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
20000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
20010 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
20020 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
20030 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
20040 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
20050 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
20060 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
20070 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20080 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
20090 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
200a0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
200b0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
200c0 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
200d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
200e0 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
200f0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
20100 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
20110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20130 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
20140 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  n0, constMask, r
20150 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
20180 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
20190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
201a0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
201b0 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
201c0 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
201d0 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
201e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
201f0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
20200 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
20210 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
20220 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
20230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20240 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
20250 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
20260 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
20270 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
20280 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
20290 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
202a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
202b0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
202c0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
202d0 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
202e0 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
202f0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
20300 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
20310 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
20320 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
20330 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
20340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20350 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
20360 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
20370 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
20380 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20390 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
203a0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
203b0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
203c0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
203d0 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  t->iTable==0 ){.
203e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
203f0 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73  Left->iTable = s
20400 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
20410 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
20420 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b  r->pLeft, 0, 0);
20430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20440 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 70 4c  nReg = pExpr->pL
20450 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
20460 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
20470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20480 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
20490 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
204a0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
204b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
204c0 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
204d0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
204e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
204f0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
20500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20510 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
20520 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20530 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
20540 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
20550 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
20560 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
20570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20580 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
20590 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
205a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
205b0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
205c0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
205d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
205e0 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
205f0 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
20600 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
20610 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
20620 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
20630 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
20640 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20650 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
20660 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
20670 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
20680 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20690 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
206a0 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
206b0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
206c0 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
206d0 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
206e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
206f0 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
20700 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
20710 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
20720 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
20730 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
20740 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
20750 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
20760 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
20770 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
20780 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
20790 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b  , target, 0, 0);
207a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
207b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
207c0 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
207d0 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
207e0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
207f0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
20800 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
20810 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
20820 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
20830 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
20840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
20850 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
20860 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
20870 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
20880 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
20890 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
208a0 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
208b0 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
208c0 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
208d0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
208e0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
208f0 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
20900 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
20910 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
20920 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
20930 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
20940 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
20950 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
20960 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
20970 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
20980 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
20990 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
209a0 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
209b0 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
209c0 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
209d0 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
209e0 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
209f0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
20a00 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
20a10 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
20a20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
20a30 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
20a40 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
20a50 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
20a60 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
20a70 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
20a80 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
20a90 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
20aa0 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
20ab0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
20ac0 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
20ad0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
20ae0 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
20af0 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
20b00 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
20b10 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
20b20 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
20b30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
20b40 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
20b50 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
20b60 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
20b70 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
20b80 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
20b90 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
20ba0 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
20bb0 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
20bc0 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
20bd0 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
20be0 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
20bf0 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
20c00 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
20c10 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
20c20 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
20c30 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
20c40 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
20c50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
20c60 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
20c70 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
20c80 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
20c90 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
20ca0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
20cb0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
20cc0 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
20cd0 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
20ce0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
20cf0 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
20d00 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
20d10 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
20d20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
20d30 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
20d40 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
20d50 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
20d60 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
20d70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
20d80 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
20d90 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
20da0 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
20db0 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
20dc0 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
20dd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
20de0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
20df0 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
20e00 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
20e10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
20e20 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
20e30 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
20e40 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
20e50 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
20e60 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
20e70 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
20e80 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
20e90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20ea0 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
20eb0 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
20ec0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
20ed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20ee0 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
20ef0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
20f00 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
20f10 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20   -> $%d",.      
20f20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
20f30 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
20f40 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
20f50 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
20f60 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
20f70 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
20f80 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65  ->iColumn].zName
20f90 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65  ),.        targe
20fa0 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66  t.      ));..#if
20fb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20fc0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
20fd0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
20fe0 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20  column has REAL 
20ff0 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79  affinity, it may
21000 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
21010 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  ored as an.     
21020 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65   ** integer. Use
21030 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
21040 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
21050 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e   is really real.
21060 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21070 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
21080 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51  R-60985-57662 SQ
21090 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72  Lite will conver
210a0 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b  t the value back
210b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f   to.      ** flo
210c0 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e  ating point when
210d0 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66   extracting it f
210e0 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20  rom the record. 
210f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
21100 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
21110 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
21120 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
21130 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
21140 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
21150 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21170 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
21180 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
21190 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
211a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
211b0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  }..    case TK_V
211c0 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  ECTOR: {.      s
211d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
211e0 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
211f0 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
21200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21210 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
21220 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
21230 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
21240 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
21250 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
21260 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
21270 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
21280 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
21290 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
212a0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
212b0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
212c0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
212d0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
212e0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
212f0 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
21300 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
21310 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
21320 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
21330 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
21340 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
21350 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
21360 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
21370 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
21380 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
21390 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
213a0 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
213b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
213c0 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
213d0 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
213e0 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
213f0 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
21400 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
21410 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
21420 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
21430 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
21440 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
21450 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
21460 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
21470 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
21480 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
21490 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
214a0 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
214b0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
214c0 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
214d0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
214e0 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
214f0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
21500 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
21510 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
21520 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
21530 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
21540 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
21550 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
21560 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
21570 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
21580 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
21590 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
215a0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
215b0 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
215c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
215d0 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
215e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
215f0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
21600 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
21610 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
21620 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
21630 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
21640 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
21650 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
21660 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
21690 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
216a0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
216b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
216d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
216e0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
216f0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
21700 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
21710 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
21720 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
21730 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
21740 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
21750 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
21760 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
21770 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
21780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21790 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
217a0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
217b0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
217d0 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
217e0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
217f0 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21810 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
21820 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
21830 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f  B) */.      VVA_
21840 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65  ONLY( int iCache
21850 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
21860 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a  iCacheLevel; )..
21870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
21880 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21890 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
218a0 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
218b0 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
218c0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
218d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
218e0 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
218f0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
21900 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
21910 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
21920 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
21930 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
21940 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
21950 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21960 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
21970 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
21980 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
21990 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20   tempX = *pX;.  
219a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
219b0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
219c0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
219d0 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d  rToRegister(&tem
219e0 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  pX, exprCodeVect
219f0 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  or(pParse, &temp
21a00 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
21a10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21a20 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
21a30 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
21a40 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73  &opCompare, 0, s
21a50 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29  izeof(opCompare)
21a60 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  );.        opCom
21a70 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
21a80 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
21a90 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70  re.pLeft = &temp
21aa0 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
21ab0 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
21ac0 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
21ad0 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
21ae0 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
21af0 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
21b00 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
21b10 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
21b20 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
21b30 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
21b40 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
21b50 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
21b60 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
21b70 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
21b80 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
21b90 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
21ba0 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
21bb0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
21bc0 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
21bd0 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
21be0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21bf0 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
21c00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21c10 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
21c20 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
21c30 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
21c40 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
21c50 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
21c60 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
21c70 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
21c80 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
21c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21ca0 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
21cb0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
21cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21cd0 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
21ce0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21cf0 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
21d00 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
21d10 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
21d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21d30 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
21d40 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
21d50 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
21d60 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
21d70 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
21d80 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
21d90 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
21da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21db0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
21dc0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
21dd0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
21de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21df0 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65  eGoto(v, endLabe
21e00 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
21e10 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
21e20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
21e30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
21e40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
21e50 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
21e60 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
21e70 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
21e80 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21e90 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
21ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21eb0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
21ec0 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31  EList->a[nExpr-1
21ed0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
21ee0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21ef0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21f00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  arse);.      }el
21f10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21f20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21f30 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
21f40 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
21f50 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
21f60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
21f70 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a  pParse->nErr>0 .
21f80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
21f90 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
21fa0 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29  l==iCacheLevel )
21fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21fc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21fd0 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
21fe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21ff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22000 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
22010 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
22020 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22030 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
22040 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20  =OE_Rollback .  
22050 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
22060 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
22070 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20  Abort.          
22080 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
22090 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ity==OE_Fail.   
220a0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
220b0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
220c0 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
220d0 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
220e0 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
220f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22100 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
22110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22120 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
22130 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
22140 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
22150 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
22160 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
22170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22180 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
22190 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  y==OE_Abort ){. 
221a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
221b0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
221c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
221d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
221e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
221f0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
22200 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
22210 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
22220 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
22230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
22240 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20  .            v, 
22250 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
22260 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30  OK, OE_Ignore, 0
22270 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
22280 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  n,0);.        Vd
22290 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
222a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
222b0 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
222c0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
222d0 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
222e0 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20  INT_TRIGGER,.   
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
22310 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
22320 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
22330 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
22340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22350 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
22360 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22370 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
22380 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
22390 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
223a0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
223b0 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
223c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72  .}../*.** Factor
223d0 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66   out the code of
223e0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
223f0 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c  ssion to initial
22400 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
22410 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22420 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50  rCodeAtInit(.  P
22430 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22440 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22450 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
22460 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
22470 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
22480 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44  code when the VD
22490 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a  BE initializes *
224a0 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c  /.  int regDest,
224b0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
224c0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
224d0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75   register */.  u
224e0 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20 20  8 reusable      
224f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
22500 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
22510 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  eusable */.){.  
22520 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61  ExprList *p;.  a
22530 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74  ssert( ConstFact
22540 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a  orOk(pParse) );.
22550 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43    p = pParse->pC
22560 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70  onstExpr;.  pExp
22570 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
22580 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
22590 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Expr, 0);.  p = 
225a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
225b0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
225c0 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   pExpr);.  if( p
225d0 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20   ){.     struct 
225e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
225f0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
22600 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70  nExpr-1];.     p
22610 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
22620 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b  prReg = regDest;
22630 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
22640 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65  sable = reusable
22650 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
22660 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a  pConstExpr = p;.
22670 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
22680 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
22690 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
226a0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
226b0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
226c0 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
226d0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
226e0 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
226f0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
22700 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
22710 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
22720 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
22730 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
22740 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
22750 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
22760 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
22770 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
22780 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
22790 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
227a0 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
227b0 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
227c0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
227d0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
227e0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
227f0 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
22800 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
22810 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
22820 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
22830 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
22840 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
22850 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
22860 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
22870 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
22880 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
22890 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
228a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
228b0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
228c0 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
228d0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
228e0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
228f0 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
22900 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
22910 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
22920 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
22930 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
22940 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
22950 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
22960 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
22970 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
22980 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  stExpr;.    int 
22990 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20  i;.    *pReg  = 
229a0 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  0;.    if( p ){.
229b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
229c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
229d0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  m;.      for(pIt
229e0 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
229f0 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
22a00 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  +, i--){.       
22a10 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73   if( pItem->reus
22a20 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45  able && sqlite3E
22a30 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
22a40 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
22a50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22a60 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e    return pItem->
22a70 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b  u.iConstExprReg;
22a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22a90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20   }.    }.    r2 
22aa0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
22ac0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
22ad0 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31  se, pExpr, r2, 1
22ae0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22af0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
22b00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
22b10 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  e);.    r2 = sql
22b20 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22b30 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22b40 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
22b50 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a  2==r1 ){.      *
22b60 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d  pReg = r1;.    }
22b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
22b80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
22b90 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
22ba0 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a       *pReg = 0;.
22bb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22bc0 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
22bd0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
22be0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
22bf0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
22c00 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
22c10 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
22c20 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
22c30 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
22c40 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
22c50 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
22c60 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76  ter target..*/.v
22c70 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
22c80 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
22c90 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
22ca0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
22cb0 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
22cc0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
22cd0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
22ce0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
22cf0 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
22d00 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
22d10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
22d20 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
22d30 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
22d40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
22d50 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
22d60 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
22d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22d80 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22d90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
22da0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
22db0 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73  Vdbe!=0 || pPars
22dc0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
22dd0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
22de0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
22df0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
22e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22e10 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
22e20 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
22e30 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
22e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
22e50 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e  *.** Make a tran
22e60 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78  sient copy of ex
22e70 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
22e80 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20  nd then code it 
22e90 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
22ea0 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69  ExprCode().  Thi
22eb0 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
22ec0 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
22ed0 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65  3ExprCode().** e
22ee0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69  xcept that the i
22ef0 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
22f00 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
22f10 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   be unchanged..*
22f20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22f30 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
22f40 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
22f50 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
22f60 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
22f70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22f80 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
22f90 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
22fa0 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64  pr, 0);.  if( !d
22fb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22fc0 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ) sqlite3ExprCod
22fd0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
22fe0 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69   target);.  sqli
22ff0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
23000 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
23010 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
23020 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
23030 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
23040 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
23050 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
23060 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
23070 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
23080 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
23090 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
230a0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
230b0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
230c0 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n is constant, t
230d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
230e0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65  .** might choose
230f0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70   to code the exp
23100 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69  ression at initi
23110 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
23120 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23130 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
23140 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23150 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
23160 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28  t target){.  if(
23170 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
23180 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65  Factor && sqlite
23190 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
231a0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
231b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
231c0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
231d0 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  r, target, 0);. 
231e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
231f0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
23200 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
23210 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
23220 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
23230 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68  hat evaluates th
23240 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
23250 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
23260 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
23270 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
23280 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
23290 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
232a0 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
232b0 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
232c0 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
232d0 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
232e0 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
232f0 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
23300 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
23310 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
23320 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
23330 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
23340 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
23350 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
23360 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
23370 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
23380 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
23390 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
233a0 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
233b0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
233c0 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
233d0 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eused..*/.void s
233e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
233f0 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
23400 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
23410 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
23420 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
23430 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
23440 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74   iMem;..  assert
23450 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
23460 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
23470 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
23480 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
23490 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
234a0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d  r, target);.  iM
234b0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
234c0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
234d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
234e0 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65  opy, target, iMe
234f0 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  m);.  exprToRegi
23500 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d  ster(pExpr, iMem
23510 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
23520 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
23530 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
23540 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
23550 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
23560 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
23570 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
23580 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
23590 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
235a0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
235b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
235c0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
235d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
235e0 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
235f0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
23600 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
23610 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
23620 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
23630 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
23640 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
23650 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
23660 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
23670 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
23680 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
23690 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
236a0 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
236b0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ation code..**.*
236c0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
236d0 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73  L_REF flag means
236e0 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
236f0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69  s in the list wi
23700 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61  th.** ExprList.a
23710 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  [].u.x.iOrderByC
23720 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64  ol>0 have alread
23730 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64  y been evaluated
23740 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69   and stored.** i
23750 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73  n registers at s
23760 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68  rcReg, and so th
23770 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63  e value can be c
23780 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65  opied from there
23790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
237a0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
237b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
237c0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
237d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
237e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
237f0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
23800 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
23810 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
23820 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
23830 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
23840 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
23850 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
23860 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
23870 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
23880 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
23890 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
238a0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
238b0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
238c0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
238d0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
238e0 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
238f0 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
23900 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
23910 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
23920 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
23930 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
23940 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
23950 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
23960 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
23970 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
23980 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
23990 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
239a0 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
239b0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
239c0 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
239d0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
239e0 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
239f0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
23a00 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
23a10 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
23a20 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
23a30 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
23a40 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
23a50 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
23a60 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  & SQLITE_ECEL_RE
23a70 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 4c  F)!=0 && (j = pL
23a80 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  ist->a[i].u.x.iO
23a90 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
23aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23ab0 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
23ac0 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
23ad0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65  arget+i);.    }e
23ae0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
23af0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
23b00 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74  TOR)!=0 && sqlit
23b10 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
23b20 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
23b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23b40 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
23b50 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20  Expr, target+i, 
23b60 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
23b70 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d       int inReg =
23b80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23b90 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23ba0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
23bb0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
23bc0 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
23bd0 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
23be0 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  p;.        if( c
23bf0 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
23c00 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
23c10 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
23c20 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
23c30 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
23c40 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
23c50 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
23c60 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
23c70 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
23c80 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
23c90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
23ca0 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
23cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23cd0 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
23ce0 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
23cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23d10 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
23d20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
23d30 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
23d40 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
23d50 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
23d60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
23d70 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
23d80 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
23d90 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
23da0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
23db0 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
23dc0 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
23dd0 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
23de0 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
23df0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70  .**.** The xJump
23e00 49 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  If parameter det
23e10 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a  ermines details:
23e20 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20  .**.**    NULL: 
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e40 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c    Store the bool
23e50 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65  ean result in re
23e60 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71  g[dest].**    sq
23e70 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a  lite3ExprIfTrue:
23e80 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65        Jump to de
23e90 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20  st if true.**   
23ea0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23eb0 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f  lse:     Jump to
23ec0 20 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a   dest if false.*
23ed0 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e  *.** The jumpIfN
23ee0 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  ull parameter is
23ef0 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d   ignored if xJum
23f00 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  pIf is NULL..*/.
23f10 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
23f20 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
23f30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23f40 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
23f50 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
23f60 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
23f70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
23f80 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
23f90 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
23fa0 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
23fb0 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
23fc0 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c  ion or storage l
23fd0 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
23fe0 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65  d (*xJump)(Parse
23ff0 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29  *,Expr*,int,int)
24000 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74  , /* Action to t
24010 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ake */.  int jum
24020 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
24030 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
24040 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
24050 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65  LL */.){. Expr e
24060 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
24070 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
24080 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
24090 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
240a0 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
240b0 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
240c0 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
240d0 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
240e0 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
240f0 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
24100 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
24110 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
24120 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
24130 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
24140 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d  egister */...  m
24150 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c  emset(&compLeft,
24160 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
24170 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  );.  memset(&com
24180 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f  pRight, 0, sizeo
24190 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
241a0 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20  et(&exprAnd, 0, 
241b0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
241c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
241d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
241e0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
241f0 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
24200 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
24210 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
24220 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
24230 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
24240 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
24250 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
24260 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
24270 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
24280 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
24290 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
242a0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
242b0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
242c0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
242d0 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
242e0 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
242f0 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
24300 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
24310 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
24320 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65  Expr;.  exprToRe
24330 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65  gister(&exprX, e
24340 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
24350 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
24360 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
24370 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a   xJump ){.    xJ
24380 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  ump(pParse, &exp
24390 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
243a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
243b0 7b 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67  {.    exprX.flag
243c0 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  s |= EP_FromJoin
243d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
243e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
243f0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
24400 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
24410 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24420 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
24430 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
24440 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
24450 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
24460 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24470 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
24480 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
24490 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
244a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
244b0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
244c0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
244d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
244e0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
244f0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24500 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24510 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
24520 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
24530 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24540 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24550 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
24560 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
24570 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24580 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24590 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
245a0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
245b0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
245c0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
245d0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
245e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
245f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
24600 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24610 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24620 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24630 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
24640 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
24650 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
24660 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24670 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
24680 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
24690 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
246a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
246b0 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Jump==0 );.}../*
246c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
246d0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
246e0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
246f0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
24700 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
24710 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
24720 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24730 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
24740 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
24750 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
24760 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24770 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
24780 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
24790 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
247a0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
247b0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
247c0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
247d0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
247e0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
247f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
24800 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
24810 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
24820 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
24830 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
24840 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
24850 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
24860 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
24870 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
24880 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
24890 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
248a0 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
248b0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
248c0 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
248d0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
248e0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
248f0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
24900 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
24910 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
24920 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
24930 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
24940 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
24950 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
24960 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
24970 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
24980 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24990 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
249a0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
249b0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
249c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
249d0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
249e0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
249f0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
24a00 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
24a10 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
24a20 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
24a30 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
24a40 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
24a50 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
24a60 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
24a70 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
24a80 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
24a90 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
24aa0 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
24ab0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
24ac0 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
24ad0 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
24ae0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
24af0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
24b00 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
24b10 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
24b20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
24b30 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
24b40 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
24b50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
24b60 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24b70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
24b80 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
24b90 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
24ba0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
24bb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
24bc0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
24bd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
24be0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
24bf0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
24c00 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
24c20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
24c30 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
24c40 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
24c50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
24c60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
24c70 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
24c80 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
24c90 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
24ca0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
24cb0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
24cc0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
24cd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24cf0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
24d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24d10 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
24d20 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
24d30 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24d40 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
24d50 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
24d60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
24d70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
24d80 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
24d90 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
24da0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
24db0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24dc0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
24dd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
24de0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
24df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24e00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
24e10 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
24e20 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
24e30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
24e40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
24e50 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
24e60 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
24e70 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
24e80 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
24e90 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
24ea0 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
24eb0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
24ec0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
24ed0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
24ee0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
24ef0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
24f00 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
24f10 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
24f20 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
24f30 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
24f40 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
24f50 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
24f60 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
24f70 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
24f80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
24f90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24fa0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
24fb0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
24fc0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
24fd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24fe0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24ff0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
25000 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
25010 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
25020 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25030 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25040 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
25050 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
25060 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
25080 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
25090 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
250a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
250b0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
250c0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
250d0 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
250e0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
250f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25100 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
25110 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
25120 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
25130 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
25140 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25150 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
25160 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
25170 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
25180 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
25190 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
251a0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
251b0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
251c0 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
251d0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
251e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
251f0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
25200 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
25210 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25220 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25230 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
25240 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25250 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25260 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
25270 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
25280 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
25290 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
252a0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
252b0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
252c0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
252d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
252e0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
252f0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25300 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
25310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25320 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25330 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25340 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
25350 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25360 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
25370 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
25380 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
25390 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
253a0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
253b0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
253c0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
253d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
253e0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
253f0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
25400 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
25410 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
25420 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
25430 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
25440 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
25450 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
25460 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
25470 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
25480 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25490 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
254a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
254b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
254c0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
254d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
254e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
254f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
25510 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
25520 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25530 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
25540 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
25550 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
25560 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
25570 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
25580 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
25590 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
255a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
255b0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
255c0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
255d0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
255e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
255f0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
25600 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
25610 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
25620 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
25630 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25640 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
25650 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
25660 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
25670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25680 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
25690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
256a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
256b0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
256c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
256d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
256e0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
256f0 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
25700 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
25710 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
25720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25730 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
25740 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
25750 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
25760 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
25770 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
25780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25790 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
257a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
257b0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
257c0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
257d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
257e0 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
257f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
25800 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
25810 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
25820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25830 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25850 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
25870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
25880 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25890 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
258a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
258b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
258c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
258d0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
258e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
258f0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
25900 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
25910 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
25920 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
25930 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
25940 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
25950 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
25960 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
25970 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
25980 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25990 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
259a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
259b0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
259c0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
259d0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
259e0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
259f0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
25a00 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
25a10 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
25a20 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
25a30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25a40 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
25a50 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
25a60 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
25a70 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
25a80 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
25a90 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
25aa0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
25ab0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
25ac0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
25ad0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
25ae0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
25af0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
25b00 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
25b10 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
25b20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
25b30 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
25b40 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
25b50 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
25b60 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
25b70 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
25b80 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
25b90 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
25ba0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
25bb0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
25bc0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
25bd0 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
25be0 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
25bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
25c00 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
25c10 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
25c20 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
25c30 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
25c40 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
25c50 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
25c60 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25c80 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
25c90 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
25ca0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
25cb0 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
25cc0 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
25cd0 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
25ce0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
25cf0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25d10 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
25d20 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
25d30 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
25d40 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
25d50 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
25d60 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
25d70 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
25d80 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
25d90 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
25da0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
25db0 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
25dc0 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
25dd0 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
25de0 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
25df0 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
25e00 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
25e10 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
25e20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
25e30 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
25e40 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
25e50 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
25e60 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
25e70 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
25e80 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
25e90 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
25ea0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
25eb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25ec0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
25ed0 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
25ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
25ef0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
25f00 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
25f10 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
25f20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
25f30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
25f40 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25f50 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
25f60 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
25f70 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
25f80 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
25f90 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
25fa0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
25fb0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
25fc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
25fd0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
25fe0 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
25ff0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
26000 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
26010 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
26020 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
26030 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
26040 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26050 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26060 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26070 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26080 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26090 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
260a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
260b0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
260c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
260d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
260e0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
260f0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
26100 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26120 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26140 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
26150 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
26160 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
26170 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26180 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26190 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
261a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
261b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
261c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
261d0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
261e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
261f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26200 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
26210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26220 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26230 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26240 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26250 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
26260 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
26270 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
26280 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26290 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
262a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
262b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
262c0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
262d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
262e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
262f0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26300 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26310 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26320 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26330 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26340 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
26350 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
26360 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
26370 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
26380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26390 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
263a0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
263b0 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
263c0 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
263d0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
263e0 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
263f0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
26400 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
26410 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
26420 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
26430 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
26440 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26450 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26460 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26470 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26480 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26490 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
264a0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
264b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
264c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
264d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
264e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
264f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26500 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26510 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
26520 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26530 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26540 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26550 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26560 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26570 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
26580 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
26590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
265a0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
265b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
265c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
265d0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
265e0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
265f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26600 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
26610 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
26620 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
26630 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
26640 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26650 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
26660 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
26670 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
26680 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
26690 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
266a0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
266b0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
266c0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
266d0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
266e0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
266f0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
26700 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
26710 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26720 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
26730 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26740 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
26750 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
26760 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26770 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26780 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
26790 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
267a0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
267b0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
267c0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
267d0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
267e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
267f0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
26800 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
26810 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
26820 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26830 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
26840 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
26850 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
26860 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
26870 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
26880 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
26890 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
268a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
268b0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
268c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
268d0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
268e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
268f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26900 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
26910 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
26920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26930 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
26940 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26950 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
26960 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
26970 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
26980 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
26990 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
269a0 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
269b0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
269c0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
269d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
269e0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
269f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26a00 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
26a10 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
26a20 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26a30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
26a40 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
26a50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
26a60 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
26a70 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
26a80 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
26a90 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
26aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26ab0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
26ac0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
26ad0 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
26ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26af0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
26b00 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
26b10 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
26b20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
26b30 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
26b40 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
26b50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26b60 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
26b70 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
26b80 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
26b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26ba0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
26bb0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
26bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26bd0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
26be0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
26bf0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
26c00 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  : .      if( exp
26c10 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
26c20 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
26c30 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
26c40 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
26c50 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
26c60 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
26c70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
26c80 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
26c90 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
26ca0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26cb0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
26cc0 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
26cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26ce0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
26cf0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
26d00 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
26d10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
26d20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
26d30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
26d40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
26d50 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26d60 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26d70 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
26d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
26d90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26da0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26db0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
26dc0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26dd0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
26de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
26df0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26e00 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
26e10 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
26e20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
26e30 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
26e40 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
26e50 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
26e60 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
26e70 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
26e80 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
26e90 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
26ea0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
26eb0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
26ec0 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
26ed0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
26ee0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
26ef0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
26f00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
26f10 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
26f20 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
26f30 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
26f40 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
26f50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
26f60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
26f70 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26f80 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
26f90 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26fa0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
26fb0 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
26fc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
26fd0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
26fe0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
26ff0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
27000 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
27010 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
27020 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
27030 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
27040 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
27050 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
27060 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
27070 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
27080 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
27090 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
270a0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
270b0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
270c0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
270d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
270e0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
270f0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
27100 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
27110 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
27120 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
27130 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
27140 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
27150 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
27160 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
27170 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
27180 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
27190 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
271a0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
271b0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
271c0 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
271d0 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
271e0 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
271f0 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
27200 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
27210 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
27220 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
27230 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
27240 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
27250 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
27260 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
27270 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
27280 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
27290 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
272a0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
272b0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
272c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
272d0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
272e0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
272f0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
27300 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
27310 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
27320 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
27330 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
27340 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
27350 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
27360 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
27370 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
27380 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
27390 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
273a0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
273b0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
273c0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
273d0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
273e0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
273f0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
27400 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
27410 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
27420 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
27430 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
27440 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
27450 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
27460 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
27470 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
27480 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
27490 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
274a0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
274b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
274c0 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
274d0 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
274e0 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
274f0 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
27500 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
27510 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
27520 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
27530 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
27540 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
27550 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
27560 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
27570 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
27580 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
27590 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
275a0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
275b0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
275c0 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
275d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
275e0 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
275f0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
27600 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
27610 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
27620 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
27630 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
27640 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
27650 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
27660 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
27670 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
27680 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
27690 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
276a0 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
276b0 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
276c0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  n ){.    if( pA-
276d0 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
276e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
276f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
27700 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
27710 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
27720 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
27730 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
27740 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
27750 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
27760 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
27770 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
27780 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
27790 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
277a0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
277b0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
277c0 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
277d0 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
277e0 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
277f0 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
27800 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
27810 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
27820 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
27830 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
27840 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
27850 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
27860 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
27870 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
27880 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
27890 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
278a0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
278b0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
278c0 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
278d0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
278e0 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
278f0 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
27900 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
27910 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
27920 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
27930 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
27940 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
27950 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
27960 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
27970 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
27980 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
27990 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
279a0 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
279b0 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
279c0 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
279d0 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
279e0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
279f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
27a00 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
27a10 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
27a20 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
27a30 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
27a40 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
27a50 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
27a60 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
27a70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
27a80 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
27a90 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
27aa0 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
27ab0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
27ac0 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
27ad0 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
27ae0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
27af0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
27b00 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
27b10 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
27b20 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
27b30 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
27b40 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
27b50 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
27b60 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
27b70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
27b80 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
27b90 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
27ba0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
27bb0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
27bc0 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
27bd0 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
27be0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
27bf0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
27c00 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
27c10 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
27c20 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
27c30 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
27c40 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
27c50 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
27c60 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
27c70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
27c80 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
27c90 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
27ca0 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
27cb0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
27cc0 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
27cd0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
27ce0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
27cf0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
27d00 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
27d10 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
27d20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
27d30 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
27d40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
27d50 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
27d60 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
27d70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
27d80 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
27d90 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
27da0 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
27db0 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
27dc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
27dd0 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
27de0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
27df0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
27e00 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
27e10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
27e20 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
27e30 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
27e40 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
27e50 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
27e60 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
27e70 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
27e80 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
27e90 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
27ea0 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
27eb0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
27ec0 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
27ed0 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
27ee0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
27ef0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
27f00 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
27f10 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
27f20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
27f30 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
27f40 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
27f50 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
27f60 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
27f70 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
27f80 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
27f90 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
27fa0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
27fb0 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
27fc0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
27fd0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
27fe0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
27ff0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
28000 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
28010 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
28020 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
28030 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
28040 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
28050 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
28060 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
28070 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
28080 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
28090 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
280a0 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
280b0 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
280c0 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
280d0 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
280e0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
280f0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
28100 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
28110 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
28120 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
28130 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
28140 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
28150 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
28160 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
28170 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
28180 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
28190 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
281a0 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
281b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
281c0 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
281d0 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
281e0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
281f0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
28200 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
28210 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
28220 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
28230 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
28240 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
28250 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
28260 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
28270 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
28280 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
28290 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
282a0 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
282b0 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
282c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
282d0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
282e0 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
282f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
28300 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
28310 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
28320 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
28330 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
28340 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
28350 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
28360 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
28370 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
28380 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
28390 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
283a0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
283b0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
283c0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
283d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
283e0 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
283f0 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
28400 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
28410 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
28420 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
28430 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
28440 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
28450 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
28460 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
28470 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
28480 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
28490 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
284a0 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
284b0 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
284c0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
284d0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
284e0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
284f0 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
28500 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
28510 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
28520 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
28530 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
28540 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
28550 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
28560 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
28570 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
28580 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
28590 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
285a0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
285b0 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
285c0 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
285d0 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
285e0 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
285f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
28600 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
28610 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
28620 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
28630 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
28640 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
28650 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
28660 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
28670 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
28680 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
28690 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
286a0 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
286b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
286c0 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
286d0 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
286e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
286f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
28700 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28710 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
28720 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
28730 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
28740 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
28750 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
28760 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
28770 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
28780 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
28790 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
287a0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
287b0 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
287c0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
287d0 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
287e0 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
287f0 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
28800 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
28810 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
28820 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
28830 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
28840 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
28850 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
28860 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
28870 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
28880 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
28890 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
288a0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
288b0 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
288c0 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
288d0 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
288e0 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
288f0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
28900 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
28910 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
28920 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
28930 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
28940 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
28950 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
28960 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
28970 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
28980 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
28990 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
289a0 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
289b0 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
289c0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
289d0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
289e0 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
289f0 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
28a00 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
28a10 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
28a20 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
28a30 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
28a40 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
28a50 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
28a60 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
28a70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
28a80 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
28a90 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
28aa0 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
28ab0 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
28ac0 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
28ad0 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
28ae0 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
28af0 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
28b00 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
28b10 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
28b20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
28b30 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
28b40 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
28b50 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
28b60 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
28b70 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
28b80 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
28b90 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
28ba0 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
28bb0 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
28bc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
28bd0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
28be0 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
28bf0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
28c00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28c10 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
28c20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
28c30 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
28c40 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
28c50 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
28c60 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
28c70 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
28c80 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
28c90 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
28ca0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
28cb0 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
28cc0 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
28cd0 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
28ce0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
28cf0 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
28d00 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
28d10 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
28d20 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
28d30 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
28d40 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
28d50 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
28d60 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
28d70 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
28d80 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
28d90 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
28da0 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
28db0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
28dc0 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
28dd0 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
28de0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
28df0 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
28e00 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
28e10 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
28e20 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
28e30 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
28e40 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
28e50 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
28e60 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
28e70 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
28e80 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
28e90 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
28ea0 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
28eb0 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
28ec0 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
28ed0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
28ee0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
28ef0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
28f00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28f10 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
28f20 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
28f30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28f40 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
28f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28f60 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
28f80 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
28f90 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
28fa0 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
28fb0 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
28fc0 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
28fd0 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
28fe0 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
28ff0 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
29000 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
29010 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
29020 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
29030 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
29040 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
29050 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
29060 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
29070 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
29080 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
29090 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
290a0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
290b0 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
290c0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
290d0 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
290e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
290f0 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
29100 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
29110 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
29120 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
29130 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
29140 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
29150 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
29160 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
29170 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
29180 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
29190 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
291a0 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
291b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
291c0 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
291d0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
291e0 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
291f0 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
29200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
29210 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
29220 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
29230 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
29240 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
29250 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
29260 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
29270 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
29280 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
29290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
292a0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
292b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
292c0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
292d0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
292e0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
292f0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
29300 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
29310 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
29320 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
29330 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
29340 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
29350 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
29360 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
29370 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
29380 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
29390 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
293a0 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
293b0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
293c0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
293d0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
293e0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
293f0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
29400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
29410 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
29420 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
29430 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
29440 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
29450 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
29460 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
29470 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
29480 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
29490 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
294a0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
294b0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
294c0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
294d0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
294e0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
294f0 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
29500 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
29510 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
29520 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
29530 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
29540 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
29550 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
29560 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
29570 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
29580 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
29590 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
295a0 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
295b0 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
295c0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
295d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
295e0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
295f0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
29600 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
29610 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
29620 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
29630 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
29640 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
29650 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
29660 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
29670 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
29680 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
29690 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
296a0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
296b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
296c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
296d0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
296e0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
296f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
29700 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
29710 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
29720 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
29730 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
29740 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
29750 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
29760 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
29770 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
29780 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
29790 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
297a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
297b0 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
297c0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
297d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
297e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
297f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
29800 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
29810 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
29820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29830 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
29840 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
29850 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
29860 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
29870 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
29880 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
29890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
298a0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
298b0 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
298c0 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
298d0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
298e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
298f0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
29900 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
29910 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
29920 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
29930 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
29940 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
29950 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
29960 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
29970 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
29980 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
29990 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
299a0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
299b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
299c0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
299d0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
299e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
299f0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
29a00 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
29a10 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
29a20 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
29a30 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
29a40 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
29a50 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
29a60 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
29a70 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
29a80 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
29a90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
29aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29ad0 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
29ae0 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
29af0 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
29b00 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
29b10 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
29b20 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
29b30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29b40 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
29b50 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29b70 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
29b80 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
29b90 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
29ba0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
29bb0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
29bc0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
29bd0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
29be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29bf0 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
29c00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
29c10 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
29c20 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
29c30 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
29c40 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
29c50 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
29c60 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
29c70 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c90 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
29ca0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
29cb0 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
29cc0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
29ce0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
29cf0 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
29d00 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
29d10 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
29d20 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
29d30 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
29d40 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
29d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29d60 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
29d70 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
29d90 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
29da0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
29db0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
29dc0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
29dd0 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
29de0 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
29df0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
29e10 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
29e20 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
29e30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
29e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29e50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29e80 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
29e90 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
29ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29eb0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
29ec0 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
29ed0 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
29ee0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
29ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29f00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
29f10 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
29f20 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
29f30 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
29f40 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
29f50 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
29f60 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
29f70 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
29f80 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
29f90 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
29fa0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
29fb0 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
29fc0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
29fd0 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
29fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29ff0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2a000 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
2a010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2a020 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2a030 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2a040 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2a050 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2a060 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2a070 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
2a080 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
2a090 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
2a0a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
2a0b0 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
2a0c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a0d0 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
2a0e0 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
2a0f0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
2a100 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
2a110 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
2a120 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
2a130 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
2a140 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2a150 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
2a160 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
2a170 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
2a180 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
2a190 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
2a1a0 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
2a1b0 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
2a1c0 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
2a1d0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2a1e0 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
2a1f0 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
2a200 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
2a210 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
2a220 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
2a230 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
2a240 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2a250 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a260 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2a270 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
2a280 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2a290 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2a2a0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2a2b0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
2a2c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2a2d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2a2e0 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
2a2f0 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
2a300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2a310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2a320 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a330 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
2a340 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
2a350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
2a360 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
2a370 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
2a380 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
2a390 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
2a3a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
2a3b0 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
2a3c0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
2a3d0 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
2a3e0 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
2a3f0 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
2a400 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
2a410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2a420 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a430 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2a440 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2a450 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2a460 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
2a470 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
2a480 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
2a490 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2a4a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
2a4b0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2a4c0 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2a4d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2a4e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2a4f0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
2a500 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2a510 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
2a520 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
2a530 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2a550 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a  xpr->u.zToken, .
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
2a580 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
2a590 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
2a5a0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
2a5b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
2a5c0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2a5d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
2a5e0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2a5f0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
2a600 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
2a610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a620 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2a630 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2a640 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a660 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
2a670 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
2a680 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
2a690 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
2a6a0 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
2a6b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
2a6c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2a6d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2a6e0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2a6f0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2a700 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2a710 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2a720 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2a730 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2a740 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
2a750 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2a760 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2a770 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2a780 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
2a790 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2a7a0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
2a7b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a7c0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2a7d0 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2a7e0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2a7f0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
2a800 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2a810 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2a820 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2a830 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
2a840 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a850 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
2a860 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2a870 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
2a880 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
2a890 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
2a8a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
2a8b0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
2a8c0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
2a8d0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
2a8e0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
2a8f0 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
2a900 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
2a910 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
2a920 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
2a930 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
2a940 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
2a950 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
2a960 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2a970 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2a980 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
2a990 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
2a9a0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
2a9b0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
2a9c0 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
2a9d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2a9e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2a9f0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2aa00 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
2aa10 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
2aa20 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2aa30 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
2aa40 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
2aa50 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
2aa60 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2aa70 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2aa80 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
2aa90 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
2aaa0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2aab0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
2aac0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2aad0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
2aae0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
2aaf0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2ab00 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
2ab10 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
2ab20 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
2ab30 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
2ab40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2ab50 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
2ab60 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
2ab70 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
2ab80 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
2ab90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2aba0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2abb0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2abc0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2abd0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
2abe0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2abf0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
2ac00 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2ac10 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
2ac20 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
2ac30 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
2ac40 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
2ac50 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2ac60 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
2ac70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
2ac80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2ac90 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
2aca0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
2acb0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
2acc0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
2acd0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
2ace0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2acf0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2ad00 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2ad10 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
2ad20 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
2ad30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
2ad40 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
2ad50 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
2ad60 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
2ad70 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2ad80 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
2ad90 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
2ada0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
2adb0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
2adc0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
2add0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
2ade0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
2adf0 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
2ae00 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
2ae10 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
2ae20 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
2ae30 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2ae40 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
2ae50 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
2ae60 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
2ae70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
2ae80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
2ae90 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2aea0 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
2aeb0 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
2aec0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
2aed0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2aee0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2aef0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
2af00 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
2af10 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
2af20 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
2af30 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
2af40 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
2af50 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
2af60 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
2af70 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
2af80 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2af90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2afa0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2afb0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
2afc0 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
2afd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2afe0 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
2aff0 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
2b000 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
2b010 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
2b020 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2b030 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2b040 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
2b050 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
2b060 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
2b070 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
2b080 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
2b090 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
2b0a0 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
2b0b0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
2b0c0 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
2b0d0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2b0e0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
2b0f0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2b100 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
2b110 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
2b120 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
2b130 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2b140 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
2b150 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
2b160 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2b170 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2b180 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
2b190 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c  int nReg){.  sql
2b1a0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
2b1b0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
2b1c0 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
2b1d0 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
2b1e0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
2b1f0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2b200 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2b210 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
2b220 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2b230 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
2b240 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
2b250 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
2b260 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
2b270 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
2b280 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2b290 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2b2a0 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
2b2b0 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
2b2c0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
2b2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61  .}../*.** Valida
2b2e0 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f  te that no tempo
2b2f0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61  rary register fa
2b300 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72  lls within the r
2b310 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73  ange of.** iFirs
2b320 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
2b330 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ive.  This routi
2b340 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20  ne is only call 
2b350 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65  from within asse
2b360 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
2b370 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ts..*/.#ifdef SQ
2b380 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
2b390 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
2b3a0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2b3b0 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20  se, int iFirst, 
2b3c0 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  int iLast){.  in
2b3d0 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
2b3e0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20  e->nRangeReg>0. 
2b3f0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2b400 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e  ngeReg+pParse->n
2b410 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20  RangeReg<iLast. 
2b420 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2b430 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20  ngeReg>=iFirst. 
2b440 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
2b450 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
2b460 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d  ; i<pParse->nTem
2b470 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pReg; i++){.    
2b480 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  if( pParse->aTem
2b490 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20  pReg[i]>=iFirst 
2b4a0 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  && pParse->aTemp
2b4b0 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b  Reg[i]<=iLast ){
2b4c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2b4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b4e0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
2b4f0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2b500 2a 2f 0a                                         */.