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

Artifact 6bce2cbdd822963cf28e782938a96274cc37f18ac28dec7a4e35ccac09f66ce8:


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 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
1e20: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
1e30: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
1e40: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
1e50: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1e60: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
1e70: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
1e80: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
1e90: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
1ea0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
1eb0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
1ec0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
1ed0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
1ee0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
1ef0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
1f00: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
1f10: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
1f20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
1f30: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
1f40: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1f50: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
1f60: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
1f70: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
1f80: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
1f90: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
1fa0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
1fb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1fc0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
1fd0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
1fe0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1ff0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
2000: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2010: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2020: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2030: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2040: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2050: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2060: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2070: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2080: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2090: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
20a0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
20b0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
20c0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
20d0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
20e0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
20f0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
2100: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2110: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2120: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2130: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2140: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2150: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2160: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2170: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2180: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2190: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
21a0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
21b0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
21c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21d0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
21e0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
21f0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
2200: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2210: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2220: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2230: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2240: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2250: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2260: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2270: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2280: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2290: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
22a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
22b0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
22c0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
22d0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
22e0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
22f0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
2300: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2310: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2320: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2330: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2340: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2350: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2360: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2370: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2380: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2390: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
23a0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
23b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23c0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
23d0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
23e0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
23f0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
2400: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2410: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2420: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2430: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2440: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2450: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2460: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2470: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2480: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2490: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
24a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
24c0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
24d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
24e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
24f0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2500: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2510: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2520: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2530: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2550: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2560: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2570: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2580: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2590: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
25a0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
25b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
25c0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
25d0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
25e0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
25f0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
2600: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2610: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2620: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2630: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2640: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2650: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2660: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2670: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2680: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2690: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
26a0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
26b0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
26c0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
26d0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
26e0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
26f0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2700: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2710: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2720: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2730: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2740: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2750: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2760: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2770: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2780: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2790: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
27a0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27b0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
27c0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
27d0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
27e0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2800: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2810: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2820: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2830: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2840: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2850: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2870: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2880: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2890: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
28a0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
28b0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
28c0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
28d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
28e0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
28f0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2900: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2910: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2920: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2930: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2940: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2950: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2960: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2970: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2980: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2990: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
29a0: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
29b0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
29c0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
29d0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
29e0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
29f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2a00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a10: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2a20: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2a30: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2a40: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2a60: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2a70: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2a80: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2a90: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2aa0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ab0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2ac0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ad0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ae0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2af0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2b10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2b20: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2b30: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2b40: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2b50: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2b60: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2b70: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2b80: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2b90: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2ba0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2bb0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2bc0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2bd0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2be0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2bf0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c00: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
2c10: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
2c20: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
2c30: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
2c40: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
2c50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
2c60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
2c80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2c90: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 65 78  inter to a subex
2ca0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56 65 63  pression of pVec
2cb0: 74 6f 72 20 74 68 61 74 20 69 73 20 74 68 65 20  tor that is the 
2cc0: 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  i-th.** column o
2cd0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 28 6e 75  f the vector (nu
2ce0: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
2cf0: 77 69 74 68 20 30 29 2e 20 20 54 68 65 20 63 61  with 0).  The ca
2d00: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73  ller must.** ens
2d10: 75 72 65 20 74 68 61 74 20 69 20 69 73 20 77 69  ure that i is wi
2d20: 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a  thin range..**.*
2d30: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
2d40: 72 65 61 6c 6c 79 20 61 20 73 63 61 6c 61 72 20  really a scalar 
2d50: 28 61 6e 64 20 22 73 63 61 6c 61 72 22 20 68 65  (and "scalar" he
2d60: 72 65 20 69 6e 63 6c 75 64 65 73 20 73 75 62 71  re includes subq
2d70: 75 65 72 69 65 73 0a 2a 2a 20 74 68 61 74 20 72  ueries.** that r
2d80: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 63  eturn a single c
2d90: 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20 72 65 74  olumn!) then ret
2da0: 75 72 6e 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f  urn pVector unmo
2db0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56  dified..**.** pV
2dc0: 65 63 74 6f 72 20 72 65 74 61 69 6e 73 20 6f 77  ector retains ow
2dd0: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 72  nership of the r
2de0: 65 74 75 72 6e 65 64 20 73 75 62 65 78 70 72 65  eturned subexpre
2df0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
2e00: 74 68 65 20 76 65 63 74 6f 72 20 69 73 20 61 20  the vector is a 
2e10: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65  (SELECT ...) the
2e20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2e30: 20 72 65 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20   returned is.** 
2e40: 6a 75 73 74 20 74 68 65 20 65 78 70 72 65 73 73  just the express
2e50: 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ion for the i-th
2e60: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
2e70: 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 6d 61 79  ult set, and may
2e80: 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 79  .** not be ready
2e90: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 20   for evaluation 
2ea0: 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c  because the tabl
2eb0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
2ec0: 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73   yet.** been pos
2ed0: 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72  itioned..*/.Expr
2ee0: 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46   *sqlite3VectorF
2ef0: 69 65 6c 64 53 75 62 65 78 70 72 28 45 78 70 72  ieldSubexpr(Expr
2f00: 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74 20 69   *pVector, int i
2f10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73  ){.  assert( i<s
2f20: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
2f30: 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20 29 3b  Size(pVector) );
2f40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2f50: 70 72 49 73 56 65 63 74 6f 72 28 70 56 65 63 74  prIsVector(pVect
2f60: 6f 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  or) ){.    asser
2f70: 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d  t( pVector->op2=
2f80: 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f  =0 || pVector->o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 3b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f  ;.    if( pVecto
2fb0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
2fc0: 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32   || pVector->op2
2fd0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2ff0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
3000: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3010: 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
3020: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
3030: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
3040: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
3050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65    }.  return pVe
3060: 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ctor;.}.#endif /
3070: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
3080: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
3090: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
30a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
30b0: 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  Y./*.** Compute 
30c0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
30d0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69   Expr object whi
30e0: 63 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74  ch when passed t
30f0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  o.** sqlite3Expr
3100: 43 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65  Code() will gene
3110: 72 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61  rate all necessa
3120: 72 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  ry code to compu
3130: 74 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64  te.** the iField
3140: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
3150: 65 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  e vector express
3160: 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a  ion pVector..**.
3170: 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20  ** It is ok for 
3180: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20  pVector to be a 
3190: 73 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20  scalar (as long 
31a0: 61 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20  as iField==0).  
31b0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
31c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  , this routine w
31d0: 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  orks like sqlite
31e0: 33 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a  3ExprDup()..**.*
31f0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e  * The caller own
3200: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  s the returned E
3210: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  xpr object and i
3220: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
3230: 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68  r.** ensuring th
3240: 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
3250: 76 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79  value eventually
3260: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a   gets freed..**.
3270: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65  ** The caller re
3280: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
3290: 6f 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20  of pVector.  If 
32a0: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
32b0: 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20  SELECT,.** then 
32c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
32d0: 65 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e  ect will referen
32e0: 63 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73  ce pVector and s
32f0: 6f 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72  o pVector must r
3300: 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66  emain.** valid f
3310: 6f 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74  or the life of t
3320: 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
3330: 63 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20  ct.  If pVector 
3340: 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  is a TK_VECTOR.*
3350: 2a 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78  * or a scalar ex
3360: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69  pression, then i
3370: 74 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  t can be deleted
3380: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73   as soon as this
3390: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
33a0: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69  rns..**.** A tri
33b0: 63 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b  ck to cause a TK
33c0: 5f 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20  _SELECT pVector 
33d0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f  to be deleted to
33e0: 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74  gether with.** t
33f0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
3400: 20 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74   object is to at
3410: 74 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72  tach the pVector
3420: 20 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66   to the pRight f
3430: 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ield.** of the r
3440: 65 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43  eturned TK_SELEC
3450: 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62  T_COLUMN Expr ob
3460: 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ject..*/.Expr *s
3470: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
3480: 74 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73  torField(.  Pars
3490: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
34a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
34b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
34c0: 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a  Vector,       /*
34d0: 20 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69   The vector.  Li
34e0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
34f0: 73 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43  s or a sub-SELEC
3500: 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c  T */.  int iFiel
3510: 64 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  d           /* W
3520: 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  hich column of t
3530: 68 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74  he vector to ret
3540: 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  urn */.){.  Expr
3550: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56   *pRet;.  if( pV
3560: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
3570: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
3580: 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61  rt( pVector->fla
3590: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
35a0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t );.    /* The 
35b0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
35c0: 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20   Expr node:.    
35d0: 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a  **.    ** pLeft:
35e0: 20 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74             pVect
35f0: 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b  or containing TK
3600: 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65  _SELECT.  Not de
3610: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52  leted..    ** pR
3620: 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e  ight:          n
3630: 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65  ot used.  But re
3640: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3650: 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d  d..    ** iColum
3660: 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78  n:         Index
3670: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
3680: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69  pVector.    ** i
3690: 54 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20  Table:          
36a0: 30 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20  0 or the number 
36b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68  of columns on th
36c0: 65 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69  e LHS of an assi
36d0: 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c  gnment.    ** pL
36e0: 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46  eft->iTable:   F
36f0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3700: 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c   of register hol
3710: 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20  ding result, or 
3720: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
3730: 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65            if the
3740: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79   result is not y
3750: 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20  et computed..   
3760: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   **.    ** sqlit
3770: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73  e3ExprDelete() s
3780: 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70  pecifically skip
3790: 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
37a0: 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a  delete of.    **
37b0: 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c   pLeft on TK_SEL
37c0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
37d0: 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73  .  But pRight is
37e0: 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56   followed, so pV
37f0: 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e  ector.    ** can
3800: 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20   be attached to 
3810: 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20  pRight to cause 
3820: 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b  this node to tak
3830: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20  e ownership of. 
3840: 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20     ** pVector.  
3850: 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20  Typically there 
3860: 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65  will be multiple
3870: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3880: 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77  N nodes.    ** w
3890: 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65  ith the same pLe
38a0: 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ft pointer to th
38b0: 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f  e pVector, but o
38c0: 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a  nly one of them.
38d0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20      ** will own 
38e0: 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20  the pVector..   
38f0: 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73   */.    pRet = s
3900: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
3910: 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  se, TK_SELECT_CO
3920: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
3930: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
3940: 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e     pRet->iColumn
3950: 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20   = iField;.     
3960: 20 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70   pRet->pLeft = p
3970: 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Vector;.    }.  
3980: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
3990: 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c  0 || pRet->iTabl
39a0: 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  e==0 );.  }else{
39b0: 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72  .    if( pVector
39c0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ->op==TK_VECTOR 
39d0: 29 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63  ) pVector = pVec
39e0: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
39f0: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
3a00: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
3a10: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
3a20: 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29  >db, pVector, 0)
3a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3a40: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
3a50: 20 21 64 65 66 69 6e 65 28 53 51 4c 49 54 45 5f   !define(SQLITE_
3a60: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a  OMIT_SUBQUERY) *
3a70: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  /../*.** If expr
3a80: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a90: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3aa0: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3ab0: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3ac0: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3ad0: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3ae0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3af0: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3b00: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3b10: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3b20: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3b30: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3b40: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3b50: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3b60: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3b70: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b80: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b90: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3ba0: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3bb0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3bc0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3bd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3be0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3bf0: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3c00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3c10: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3c20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3c30: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3c40: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3c50: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3c60: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3c70: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c90: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3ca0: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3cb0: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3cc0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3cd0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3ce0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3cf0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3d00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3d10: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3d20: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3d30: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3d40: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3d50: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3d60: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3d70: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d80: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d90: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3da0: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3db0: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3dc0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dd0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3de0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3df0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3e00: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3e10: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3e20: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3e30: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3e40: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3e50: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3e60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3e70: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e90: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3ea0: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3eb0: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3ec0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3ed0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3ee0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3ef0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3f00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3f10: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3f20: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3f30: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3f40: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3f50: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3f60: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3f70: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f80: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3fa0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3fb0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3fc0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3fd0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3fe0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3ff0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
4000: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4020: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4030: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4040: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4050: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4060: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4070: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4080: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
40a0: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
40b0: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
40c0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
40f0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4100: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4110: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4120: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4130: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4140: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4150: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4160: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4170: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4180: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4190: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
41b0: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
41c0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
41d0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
41e0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
41f0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4200: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4210: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4220: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4230: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4240: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4250: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4260: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4270: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4280: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4290: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
42a0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
42b0: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
42c0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
42d0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
42e0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
42f0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4300: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4310: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4320: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4330: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4340: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4350: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4360: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4370: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4380: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4390: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
43a0: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
43b0: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
43c0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
43d0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
43e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
43f0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4410: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4420: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4430: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4440: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4450: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4460: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4470: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4480: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4490: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
44a0: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
44c0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
44d0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
44e0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
44f0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4500: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4510: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4520: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4530: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4540: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4550: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4560: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4580: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4590: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
45a0: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
45c0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
45d0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45f0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4600: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4610: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4620: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4630: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4640: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4650: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4660: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4670: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4680: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
46a0: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
46b0: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
46c0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
46d0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
46e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
46f0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4700: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4710: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
4720: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
4730: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4740: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
4750: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
4760: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4770: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4780: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4790: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
47a0: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
47b0: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
47c0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
47d0: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
47e0: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
47f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4800: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4810: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
4820: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
4830: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
4840: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
4850: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
4860: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
4870: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4880: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4890: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
48a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
48b0: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
48c0: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
48d0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
48e0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
48f0: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4900: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4910: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
4920: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
4930: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
4940: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
4950: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
4960: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
4970: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4980: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4990: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
49a0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
49c0: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
49d0: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
49e0: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
49f0: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4a00: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4a10: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
4a20: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
4a30: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
4a40: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
4a50: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
4a60: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
4a70: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a80: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a90: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4aa0: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4ab0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4ac0: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4ad0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4ae0: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4af0: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4b00: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4b10: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4b20: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4b30: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4b40: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4b50: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4b60: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4b70: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b80: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b90: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ba0: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4bb0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4bc0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4bd0: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4be0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4bf0: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4c00: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4c10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4c20: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4c30: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4c40: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4c50: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4c60: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4c70: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4ca0: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4cb0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4cc0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4cd0: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4ce0: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4cf0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4d00: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4d10: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4d70: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d90: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4da0: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4db0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4dc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4dd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4de0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4df0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4e00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4e10: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4e20: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4e40: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4e50: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4e60: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e90: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4ea0: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4eb0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4ec0: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4ed0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4ee0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4ef0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4f00: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4f10: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4f20: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4f30: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4f40: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4f50: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4f60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4f70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f80: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f90: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4fa0: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4fb0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4fc0: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4fd0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4fe0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4ff0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
5000: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5010: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5020: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5030: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5050: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
5060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
5070: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5080: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5090: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
50a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
50b0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
50c0: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
50d0: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
50e0: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
50f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5100: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5110: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5120: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5130: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5140: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5150: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5160: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5170: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5190: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
51a0: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
51b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
51c0: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
51d0: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
51e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
51f0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5200: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5210: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5220: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5230: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5240: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5250: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
5260: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
5270: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5280: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5290: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
52a0: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
52b0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
52c0: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
52d0: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
52e0: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
52f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5300: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5310: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5320: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5330: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5340: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5350: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
5360: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
5370: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5380: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5390: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
53a0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
53b0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
53c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
53d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
53f0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5400: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5410: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5420: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5430: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5440: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
5450: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
5460: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
5470: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5480: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5490: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
54a0: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
54b0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
54c0: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
54f0: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5500: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5510: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
5520: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5530: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5540: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
5550: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5560: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5570: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5580: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5590: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
55a0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
55b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
55c0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
55d0: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
55e0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
55f0: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5600: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5610: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
5620: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
5630: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
5640: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
5650: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
5660: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
5670: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5680: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5690: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
56a0: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
56b0: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
56c0: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
56d0: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
56e0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
56f0: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5700: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5710: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
5720: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
5730: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
5740: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
5750: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
5760: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
5770: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5780: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5790: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
57a0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
57b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
57c0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
57d0: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
57e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
57f0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5800: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5810: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
5820: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5830: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
5840: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
5850: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5860: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5870: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5880: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5890: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
58a0: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
58b0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
58c0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
58d0: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
58e0: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
58f0: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5900: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5910: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
5920: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
5930: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
5940: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
5950: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
5960: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
5970: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5980: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5990: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
59a0: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
59b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
59c0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
59d0: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
59e0: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
59f0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5a00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5a10: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
5a20: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5a30: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
5a40: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
5a50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5a60: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5a70: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a80: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a90: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5aa0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5ab0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5ac0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5ad0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5ae0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5af0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5b00: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5b10: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5b20: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5b30: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5b40: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5b50: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5b60: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5b70: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b80: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b90: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5ba0: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5bb0: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5bc0: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5bd0: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5be0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5bf0: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5c00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5c10: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5c20: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5c30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5c40: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5c50: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5c60: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5c70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c80: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c90: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5cb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5cc0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5cd0: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5cf0: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5d00: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5d10: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5d20: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5d30: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5d40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5d50: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5d60: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5d70: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d80: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d90: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5da0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5db0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5dc0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5dd0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5de0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5df0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5e00: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5e10: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5e20: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5e30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5e40: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5e50: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5e60: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5e70: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e80: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e90: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5ea0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5eb0: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5ec0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5ed0: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5ee0: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5ef0: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5f00: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5f10: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5f20: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5f30: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5f40: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5f50: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5f60: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5f70: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f80: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f90: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5fa0: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5fb0: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5fc0: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5fd0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5fe0: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5ff0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
6000: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
6010: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
6020: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
6030: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
6040: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
6050: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
6060: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
6070: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6080: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6090: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
60a0: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
60b0: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
60c0: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
60d0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
60e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6100: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6110: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
6120: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6140: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6150: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
6160: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
6170: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6180: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6190: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
61a0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
61b0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
61c0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
61d0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
61e0: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
61f0: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6200: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6210: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
6220: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
6230: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
6240: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
6250: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
6260: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
6270: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6280: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6290: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
62a0: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
62b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
62c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
62d0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
62e0: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
62f0: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6300: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6310: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
6320: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
6330: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
6340: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
6350: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
6360: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
6370: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6380: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6390: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
63a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
63b0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
63c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
63d0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
63e0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
63f0: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6400: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6410: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6420: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6430: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6440: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6450: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
6460: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
6470: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6480: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
6490: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
64a0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
64b0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
64c0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
64d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
64e0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
64f0: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6500: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6510: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6520: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6530: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6550: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
6560: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
6570: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
6580: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
6590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
65a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
65b0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
65c0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
65d0: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
65e0: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
65f0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6600: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6610: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6620: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6640: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6650: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
6660: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
6670: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6690: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
66a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
66b0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
66c0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
66d0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
66e0: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
66f0: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6700: 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f    x.n = zToken ?
6710: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6720: 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20  (zToken) : 0;.  
6730: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
6740: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20  prAlloc(db, op, 
6750: 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &x, 0);.}../*.**
6760: 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73   Attach subtrees
6770: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6780: 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f  t to the Expr no
6790: 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  de pRoot..**.** 
67a0: 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74  If pRoot==NULL t
67b0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
67c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
67d0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
67e0: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61  urred..** In tha
67f0: 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74  t case, delete t
6800: 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  he subtrees pLef
6810: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f  t and pRight..*/
6820: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6830: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6840: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6850: 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20    Expr *pRoot,. 
6860: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20   Expr *pLeft,.  
6870: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
6880: 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29    if( pRoot==0 )
6890: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
68a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
68b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
68c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
68d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
68e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
68f0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6900: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
6910: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6920: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
6930: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6940: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6950: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
6960: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
6970: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6980: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6990: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
69a0: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
69b0: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
69c0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
69d0: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
69e0: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
69f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6a00: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6a10: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
6a20: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
6a30: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
6a40: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
6a50: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
6a60: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
6a70: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6a80: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6a90: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6aa0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6ab0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6ac0: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6ad0: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6ae0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6af0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6b00: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6b10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6b20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6b30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b50: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6b60: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6b70: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6b80: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6b90: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6ba0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
6bb0: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
6bc0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
6bd0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6be0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6c00: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6c10: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6c20: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6c30: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6c40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6c50: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6c60: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6c80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6c90: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
6ca0: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6cb0: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6cc0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
6cd0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6ce0: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
6cf0: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
6d00: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6d20: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6d30: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
6d40: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
6d50: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
6d60: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
6d70: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
6d80: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
6d90: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
6da0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
6db0: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
6dc0: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
6dd0: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
6de0: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
6df0: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
6e00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
6e10: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
6e20: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
6e30: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
6e40: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
6e50: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6e60: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
6e70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6e80: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
6e90: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
6ea0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
6eb0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6ec0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6ed0: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
6ee0: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
6ef0: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
6f00: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
6f10: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
6f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
6f30: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6f40: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6f50: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
6f60: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
6f70: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
6f80: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f90: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
6fa0: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
6fb0: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
6fc0: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
6fd0: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
6fe0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
6ff0: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
7000: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
7010: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
7020: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
7030: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
7040: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
7050: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
7060: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
7070: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
7080: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
7090: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
70a0: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
70b0: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
70c0: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
70d0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
70e0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
70f0: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
7100: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
7110: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
7120: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
7130: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
7140: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
7150: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7160: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
7170: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
7180: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
7190: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
71a0: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
71b0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
71c0: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
71d0: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
71e0: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
71f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7200: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
7210: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
7220: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7230: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
7240: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
7250: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
7260: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7270: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7280: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
7290: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
72a0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
72b0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
72c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
72d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
72e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
72f0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7300: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7310: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
7320: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
7330: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
7340: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
7350: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
7360: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
7370: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7380: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7390: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
73a0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
73b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
73c0: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
73d0: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
73e0: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
73f0: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
7400: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
7410: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
7420: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
7430: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
7440: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
7450: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
7460: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7470: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
7480: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
7490: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
74a0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
74b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
74c0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
74d0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
74e0: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
74f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
7500: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
7510: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
7520: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
7530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7540: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
7550: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
7560: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
7570: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7580: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7590: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
75a0: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
75b0: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
75c0: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
75d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
75e0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
75f0: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
7600: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
7610: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
7620: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
7630: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
7640: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
7650: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
7660: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
7670: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
7680: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
7690: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
76a0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
76b0: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
76c0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
76d0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
76e0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
76f0: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7700: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7710: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
7720: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
7730: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7740: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
7750: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
7760: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
7770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7780: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7790: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
77a0: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
77b0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
77c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
77d0: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
77e0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
77f0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7800: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7810: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
7820: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7830: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7840: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
7850: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7860: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
7870: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7880: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7890: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
78a0: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
78b0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
78c0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
78d0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
78e0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
78f0: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7900: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7910: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7920: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7930: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7940: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7950: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7960: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
7970: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7980: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7990: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
79a0: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
79b0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
79c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
79d0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
79e0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
79f0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7a00: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7a10: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7a20: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7a30: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7a40: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7a50: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7a60: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7a70: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7a80: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7a90: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7aa0: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7ab0: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7ac0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7ad0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7ae0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7af0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7b10: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7b20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7b30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7b50: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7b60: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7b70: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7b80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b90: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7ba0: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7bb0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7bc0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7bd0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7be0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7bf0: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7c00: 73 73 65 72 74 28 20 6e 3d 3d 73 71 6c 69 74 65  ssert( n==sqlite
7c10: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
7c20: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
7c30: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
7c40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
7c50: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
7c60: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
7c70: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
7c80: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
7c90: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
7ca0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
7cc0: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
7cd0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7ce0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7cf0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7d00: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7d10: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7d20: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7d30: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7d40: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7d50: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
7d60: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
7d70: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
7d80: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
7d90: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
7da0: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
7db0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7dc0: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
7dd0: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
7de0: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
7df0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7e00: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
7e10: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
7e20: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
7e30: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7e40: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
7e50: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7e60: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7e70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7e80: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7e90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7ea0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7eb0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7ec0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7ed0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7ee0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7ef0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7f00: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7f10: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7f20: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7f30: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7f40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7f50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7f60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7f70: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7f80: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7f90: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7fa0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7fb0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7fc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7fe0: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
7ff0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
8000: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
8010: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
8020: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
8030: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8040: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
8050: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
8060: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
8070: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8080: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8090: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
80a0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
80b0: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
80c0: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
80d0: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
80e0: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
80f0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8100: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8110: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
8120: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
8130: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
8140: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
8150: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
8160: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8170: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8180: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8190: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
81a0: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
81b0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
81c0: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
81d0: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
81e0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
81f0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8200: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
8220: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
8230: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
8240: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
8250: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
8260: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
8270: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8280: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8290: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
82a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
82b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
82d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
82e0: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
82f0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8300: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8310: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
8320: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
8330: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8340: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
8350: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
8360: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8370: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8380: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8390: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
83a0: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
83b0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
83c0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
83d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
83e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83f0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8400: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8410: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
8420: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
8430: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8440: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
8450: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8460: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8470: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8480: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8490: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
84a0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
84b0: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
84c0: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
84d0: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
84e0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
84f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8500: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8510: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8520: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8530: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8540: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8560: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8570: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8580: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8590: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
85a0: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
85b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
85c0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
85d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
85e0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
85f0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
8600: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8610: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
8620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
8630: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
8640: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
8650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8660: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8670: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  lete(db, p->x.pL
8680: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
8690: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
86a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
86b0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
86c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
86d0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45  Token);.  if( !E
86e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86f0: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
8700: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8710: 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  eNN(db, p);.  }.
8720: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
8730: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
8740: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8750: 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65    if( p ) sqlite
8760: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8770: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
8780: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8790: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
87a0: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
87b0: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
87c0: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
87d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
87e0: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
87f0: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
8800: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
8810: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
8820: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8830: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
8840: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
8850: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8860: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8870: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8880: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
8890: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
88a0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
88b0: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
88c0: 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  d) ) return EXPR
88d0: 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20  _REDUCEDSIZE;.  
88e0: 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c  return EXPR_FULL
88f0: 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  SIZE;.}../*.** T
8900: 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a  he dupedExpr*Siz
8910: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63  e() routines eac
8920: 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  h return the num
8930: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
8940: 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72  uired.** to stor
8950: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  e a copy of an e
8960: 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70  xpression or exp
8970: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54  ression tree.  T
8980: 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a  hey differ in.**
8990: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65   how much of the
89a0: 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65   tree is measure
89b0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70  d..**.**     dup
89c0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
89d0: 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f  ()     Size of o
89e0: 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72  nly the Expr str
89f0: 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64  ucture .**     d
8a00: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
8a10: 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66  ()       Size of
8a20: 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f   Expr + space fo
8a30: 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64  r token.**     d
8a40: 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20  upedExprSize()  
8a50: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20           Expr + 
8a60: 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20  token + subtree 
8a70: 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a  components.**.**
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
8ad0: 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72  The dupedExprStr
8ae0: 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69  uctSize() functi
8af0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76  on returns two v
8b00: 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65  alues OR-ed toge
8b10: 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74  ther:  .** (1) t
8b20: 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
8b30: 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20  d for a copy of 
8b40: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8b50: 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20  re only and .** 
8b60: 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66  (2) the EP_xxx f
8b70: 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
8b80: 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75  te what the stru
8b90: 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c  cture size shoul
8ba0: 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  d be..** The ret
8bb0: 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c  urn values is al
8bc0: 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  ways one of:.**.
8bd0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c  **      EXPR_FUL
8be0: 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58  LSIZE.**      EX
8bf0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20  PR_REDUCEDSIZE  
8c00: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a   | EP_Reduced.**
8c10: 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e        EXPR_TOKEN
8c20: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
8c30: 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68  kenOnly.**.** Th
8c40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74  e size of the st
8c50: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66  ructure can be f
8c60: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
8c70: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
8c80: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74  .** of this rout
8c90: 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20  ine with 0xfff. 
8ca0: 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62   The flags can b
8cb0: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
8cc0: 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ng the.** return
8cd0: 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52   value with EP_R
8ce0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
8cf0: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  nly..**.** Note 
8d00: 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d  that with flags=
8d10: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c  =EXPRDUP_REDUCE,
8d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77   this routines w
8d30: 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a  orks on full-siz
8d40: 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29  e.** (unreduced)
8d50: 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73   Expr objects as
8d60: 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61   they or origina
8d70: 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lly constructed 
8d80: 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a  by the parser..*
8d90: 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73  * During express
8da0: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78  ion analysis, ex
8db0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
8dc0: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
8dd0: 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61  moved into.** la
8de0: 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68  ter parts of teh
8df0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64   Expr object and
8e00: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
8e10: 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65  rmation might ge
8e20: 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66  t chopped.** off
8e30: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
8e40: 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  on is reduced.  
8e50: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69  Note also that i
8e60: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
8e70: 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58  to.** make an EX
8e80: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
8e90: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
8ea0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
8eb0: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
8ec0: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
8ed0: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
8ee0: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
8ef0: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
8f00: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
8f10: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8f20: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
8f30: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
8f40: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
8f50: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
8f60: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
8f70: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
8f80: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
8f90: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
8fa0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
8fb0: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
8fc0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
8fd0: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
8fe0: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
8ff0: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
9000: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
9010: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
9020: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
9030: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
9040: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9050: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
9060: 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73  ;.  if( 0==flags
9070: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45   || p->op==TK_SE
9080: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  LECT_COLUMN ){. 
9090: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
90a0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
90b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
90c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
90d0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
90e0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
90f0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9110: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
9120: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9130: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9140: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
9150: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9160: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9170: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
9180: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
9190: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
91a0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
91b0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
91c0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
91d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91e0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
91f0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
9200: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
9210: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9220: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
9230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
9240: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9250: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9260: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
9270: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9280: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9290: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
92a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
92b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
92c0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
92d0: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
92e0: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
92f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9300: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9310: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9320: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9330: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9340: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
9350: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
9360: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9370: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
9380: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
9390: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
93a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
93b0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
93c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
93d0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
93e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
93f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9400: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
9410: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
9420: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
9430: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9440: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9450: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
9460: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
9470: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
9480: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
9490: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
94a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
94b0: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
94c0: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
94d0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
94e0: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
94f0: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
9500: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
9510: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
9520: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
9530: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
9540: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
9550: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
9560: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
9570: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
9580: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
9590: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
95a0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
95b0: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
95c0: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
95d0: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
95e0: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
95f0: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
9600: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
9610: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
9620: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
9630: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
9640: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
9650: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9660: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9670: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
9680: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
9690: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
96a0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
96b0: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
96c0: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
96d0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
96e0: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
96f0: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
9700: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
9710: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
9720: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9730: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
9740: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9750: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
9760: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
9770: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
9780: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
9790: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
97a0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
97b0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
97c0: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
97d0: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
97e0: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
97f0: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
9800: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
9810: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
9820: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
9830: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
9840: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
9850: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
9860: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
9870: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
9880: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
9890: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
98a0: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
98b0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
98c0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
98d0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
98e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
98f0: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
9900: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
9910: 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38  int dupFlags, u8
9920: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
9930: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9940: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
9950: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38  o return */.  u8
9960: 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20   *zAlloc;       
9970: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
9980: 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ace from which t
9990: 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a  o build Expr obj
99a0: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61  ect */.  u32 sta
99b0: 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  ticFlag;       /
99c0: 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73  * EP_Static if s
99d0: 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65  pace not obtaine
99e0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
99f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
9a00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9a10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75   );.  assert( du
9a20: 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70  pFlags==0 || dup
9a30: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9a40: 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72  EDUCE );.  asser
9a50: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
9a60: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
9a70: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20  DUP_REDUCE );.. 
9a80: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
9a90: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
9aa0: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
9ab0: 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ture. */.  if( p
9ac0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a  zBuffer ){.    z
9ad0: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
9ae0: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  r;.    staticFla
9af0: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
9b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c   }else{.    zAll
9b10: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
9b20: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75  llocRawNN(db, du
9b30: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64  pedExprSize(p, d
9b40: 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73  upFlags));.    s
9b50: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20  taticFlag = 0;. 
9b60: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70   }.  pNew = (Exp
9b70: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69  r *)zAlloc;..  i
9b80: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f  f( pNew ){.    /
9b90: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
9ba0: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
9bb0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
9bc0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
9bd0: 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77  o.    ** by pNew
9be0: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
9bf0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
9c00: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
9c10: 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f   or.    ** EXPR_
9c20: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
9c30: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
9c40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9c50: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
9c60: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
9c70: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
9c80: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
9c90: 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  y)..    */.    c
9ca0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
9cb0: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
9cc0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9cd0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
9ce0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
9cf0: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
9d00: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
9d10: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
9d20: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
9d30: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
9d40: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
9d50: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f  ken ){.      nTo
9d60: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
9d70: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
9d80: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73  n) + 1;.    }els
9d90: 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  e{.      nToken 
9da0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
9db0: 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20  f( dupFlags ){. 
9dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
9dd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9de0: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
9df0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
9e00: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
9e10: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
9e20: 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20        u32 nSize 
9e30: 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63  = (u32)exprStruc
9e40: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
9e50: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
9e60: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
9e70: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
9e80: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
9e90: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
9ea0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
9eb0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
9ec0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9ed0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
9ee0: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
9ef0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
9f00: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
9f10: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
9f20: 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  /.    pNew->flag
9f30: 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65  s &= ~(EP_Reduce
9f40: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
9f50: 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54  P_Static|EP_MemT
9f60: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  oken);.    pNew-
9f70: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
9f80: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
9f90: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
9fa0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
9fb0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
9fc0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
9fd0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
9fe0: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
9ff0: 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e  /.    if( nToken
a000: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
a010: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
a020: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
a030: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
a040: 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e];.      memcpy
a050: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
a060: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
a070: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
a080: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
a090: 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54  ->flags) & (EP_T
a0a0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
a0b0: 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  )) ){.      /* F
a0c0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
a0d0: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
a0e0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
a0f0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
a100: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a110: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
a120: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a130: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
a140: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a150: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
a160: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a180: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a190: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a1a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
a1b0: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
a1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a1d0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
a1e0: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
a1f0: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
a200: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a210: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a220: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a230: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
a240: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a250: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a260: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a270: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a280: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a290: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
a2a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a2b0: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
a2c0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a2d0: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a2e0: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
a2f0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a300: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a310: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
a320: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
a330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a340: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a350: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
a360: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a370: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a380: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a390: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
a3a0: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
a3b0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  Alloc;.      }. 
a3c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3d0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a3e0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
a3f0: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
a410: 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  w->op==TK_SELECT
a420: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
a430: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
a440: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
a450: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a460: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
a470: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
a480: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a490: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20  ( p->pRight==0  
a4a0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d  || p->pRight==p-
a4b0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
a4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a4d0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a4f0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
a500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a510: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a520: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a530: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a540: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
a550: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a560: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
a570: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
a580: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
a590: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
a5a0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
a5b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
a5c0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
a5d0: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
a5e0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
a5f0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
a600: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
a610: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
a620: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a630: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
a640: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
a650: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
a660: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
a670: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
a680: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
a690: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
a6a0: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
a6b0: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
a6c0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
a6d0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
a6e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
a6f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
a700: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
a710: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
a720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a730: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
a740: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
a750: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
a760: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
a770: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
a780: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
a790: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
a7a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a7b0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
a7c0: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
a7d0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
a7e0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
a7f0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
a800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
a810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a820: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
a830: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
a840: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
a850: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a860: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
a870: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
a880: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
a890: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
a8a0: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
a8b0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
a8c0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
a8d0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
a8e0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
a8f0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
a900: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
a910: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
a920: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
a930: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
a940: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
a950: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a960: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
a970: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
a980: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
a990: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
a9a0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
a9b0: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
a9c0: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
a9d0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
a9e0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
a9f0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
aa00: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
aa10: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
aa20: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
aa30: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
aa40: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
aa50: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
aa60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
aa70: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
aa80: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
aa90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
aaa0: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
aab0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
aac0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
aad0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
aae0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
aaf0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
ab00: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
ab10: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
ab20: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
ab30: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
ab40: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
ab50: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
ab60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
ab70: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
ab80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
ab90: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
aba0: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
abb0: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
abc0: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
abd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
abe0: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
abf0: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
ac00: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
ac10: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
ac20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ac30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
ac40: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
ac50: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
ac60: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
ac70: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
ac80: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
ac90: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  m;.  int i;.  Ex
aca0: 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74  pr *pPriorSelect
acb0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Col = 0;.  asser
acc0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
acd0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
ace0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
acf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
ad00: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
ad10: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29     sizeof(*pNew)
ad20: 2b 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 5b  +sizeof(pNew->a[
ad30: 30 5d 29 2a 28 70 2d 3e 6e 45 78 70 72 2d 31 29  0])*(p->nExpr-1)
ad40: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
ad50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ad60: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
ad70: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
ad80: 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d  nExpr;.  pItem =
ad90: 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64   pNew->a;.  pOld
ada0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
adb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
adc0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
add0: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
ade0: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
adf0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
ae00: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
ae10: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74  NewExpr;.    pIt
ae20: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
ae30: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ae40: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
ae50: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
ae60: 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45  r .     && pOldE
ae70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ae80: 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  CT_COLUMN.     &
ae90: 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49  & (pNewExpr = pI
aea0: 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a  tem->pExpr)!=0 .
aeb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
aec0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
aed0: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30  Column==0 || i>0
aee0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   );.      if( pN
aef0: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
af00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
af10: 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e  sert( pOldExpr->
af20: 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d  pLeft==pOldExpr-
af30: 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  >pRight );.     
af40: 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43     pPriorSelectC
af50: 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ol = pNewExpr->p
af60: 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d  Left = pNewExpr-
af70: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
af80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
af90: 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
afa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
afb0: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20  em[-1].pExpr!=0 
afc0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
afd0: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
afe0: 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  lumn==pItem[-1].
aff0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31  pExpr->iColumn+1
b000: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b010: 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74  rt( pPriorSelect
b020: 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  Col==pItem[-1].p
b030: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
b040: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
b050: 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53  >pLeft = pPriorS
b060: 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20  electCol;.      
b070: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  }.    }.    pIte
b080: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
b090: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b0a0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
b0b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
b0c0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
b0d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b0e0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
b0f0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
b100: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
b110: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
b120: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
b130: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
b140: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70   = pOldItem->bSp
b150: 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74  anIsTab;.    pIt
b160: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
b170: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
b180: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
b190: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
b1a0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
b1b0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
b1c0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
b1d0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
b1e0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
b1f0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b200: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
b210: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
b220: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
b230: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
b240: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
b250: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
b260: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
b270: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
b280: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b290: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
b2a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b2b0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
b2c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b2d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
b2e0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
b2f0: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
b300: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
b310: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b320: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
b330: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
b340: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
b350: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b360: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b370: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b380: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
b390: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
b3a0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
b3b0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
b3c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b3d0: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
b3e0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b3f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b400: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
b410: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
b420: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
b430: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
b440: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b450: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
b460: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
b470: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b480: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
b490: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
b4a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
b4b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
b4c0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
b4d0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
b4e0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
b4f0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b500: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b510: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
b520: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
b530: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b540: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
b560: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
b570: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b580: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b590: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
b5a0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
b5b0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
b5c0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
b5d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
b5e0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
b5f0: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
b600: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
b610: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
b620: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
b630: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
b640: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
b650: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
b660: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
b670: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
b680: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
b690: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b6a0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
b6b0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
b6c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
b6d0: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
b6e0: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
b6f0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
b700: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
b710: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
b720: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
b730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b740: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
b750: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
b760: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
b770: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
b780: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
b790: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
b7a0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
b7b0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
b7c0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
b7d0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
b7e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b7f0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b800: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
b810: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b820: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
b830: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
b840: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
b850: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b860: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
b870: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
b880: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
b890: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
b8a0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
b8b0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
b8c0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
b8d0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
b8e0: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
b8f0: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
b900: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
b910: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
b920: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
b930: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b940: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
b950: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b960: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
b970: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
b980: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
b990: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
b9a0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
b9b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
b9c0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
b9d0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
b9e0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
b9f0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
ba00: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
ba10: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
ba20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
ba30: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
ba40: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
ba50: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
ba60: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
ba70: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
ba80: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
ba90: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
baa0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
bab0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
bac0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
bad0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
bae0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
baf0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
bb00: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
bb10: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
bb20: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
bb30: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
bb40: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
bb50: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
bb60: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
bb70: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
bb80: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bb90: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
bba0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
bbb0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
bbc0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
bbd0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
bbe0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bbf0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
bc00: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
bc10: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
bc20: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
bc30: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
bc40: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
bc50: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
bc60: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
bc70: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
bc80: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
bc90: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
bca0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
bcb0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
bcc0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
bcd0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
bce0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
bcf0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
bd00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
bd10: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
bd20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
bd30: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
bd40: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
bd50: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
bd60: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
bd70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bd80: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
bd90: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
bda0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
bdb0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
bdc0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
bdd0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bde0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
bdf0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
be00: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
be10: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
be20: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
be30: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
be40: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
be50: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
be60: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
be70: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
be80: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
be90: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
bea0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
beb0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bec0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
bed0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f  s);.    pNew->pO
bee0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
bef0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
bf00: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
bf10: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
bf20: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
bf30: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
bf40: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
bf50: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
bf60: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
bf70: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
bf80: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
bf90: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
bfa0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
bfb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
bfc0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bfd0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
bfe0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
bff0: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
c000: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c010: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
c020: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
c030: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c040: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c050: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c060: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c070: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c080: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c090: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c0a0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c0b0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c0c0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c0d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c0e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c0f0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c100: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c110: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c120: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c130: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c140: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c150: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c160: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
c170: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
c180: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
c190: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
c1a0: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
c1b0: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
c1c0: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
c1d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
c1e0: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
c1f0: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
c200: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
c210: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
c220: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
c230: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
c240: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
c250: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c260: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c270: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
c280: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
c290: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
c2a0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
c2b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2c0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
c2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c2e0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
c2f0: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
c300: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74   NULL */.){.  st
c310: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c320: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
c330: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c340: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
c350: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
c360: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
c370: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
c380: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c390: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
c3a0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
c3b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  st==0 ){.      g
c3c0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c3d0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78  }.    pList->nEx
c3e0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73  pr = 0;.    pLis
c3f0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
c400: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
c410: 2d 3e 6e 45 78 70 72 3d 3d 70 4c 69 73 74 2d 3e  ->nExpr==pList->
c420: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 45 78  nAlloc ){.    Ex
c430: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
c440: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
c450: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
c460: 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
c470: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
c480: 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 41 6c 6c  )+(2*pList->nAll
c490: 6f 63 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70  oc - 1)*sizeof(p
c4a0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
c4b0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
c4c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
c4d0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
c4e0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ist = pNew;.    
c4f0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
c500: 20 32 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   2;.  }.  pItem 
c510: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c520: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 6d  t->nExpr++];.  m
c530: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
c540: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
c550: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
c560: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
c570: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
c580: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
c590: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
c5a0: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
c5b0: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
c5c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
c5d0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
c5e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c5f0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
c600: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c610: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
c620: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
c630: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
c640: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
c650: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
c660: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
c670: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
c680: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
c690: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
c6a0: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
c6b0: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
c6c0: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
c6d0: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
c6e0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
c6f0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
c700: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
c710: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
c720: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
c730: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
c740: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
c750: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
c760: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
c770: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
c780: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
c790: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
c7a0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
c7b0: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
c7c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c7d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c7e0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c7f0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c800: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
c810: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
c820: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c830: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
c840: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
c850: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
c860: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
c870: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
c880: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
c890: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
c8a0: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
c8b0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c8c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c8d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c8e0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
c8f0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
c900: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
c910: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
c920: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
c930: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
c940: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
c950: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
c960: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
c970: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
c980: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
c990: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
c9a0: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
c9b0: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
c9c0: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
c9d0: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
c9e0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c9f0: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
ca00: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
ca10: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
ca20: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
ca30: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
ca40: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
ca50: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
ca60: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
ca70: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
ca80: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
ca90: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
caa0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
cab0: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
cac0: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
cad0: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
cae0: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
caf0: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
cb00: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
cb10: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
cb20: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
cb30: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
cb40: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
cb50: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
cb60: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
cb70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
cb80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
cb90: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
cba0: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cbc0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
cbd0: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
cbe0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
cbf0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
cc00: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
cc10: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
cc20: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
cc30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
cc40: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
cc50: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
cc60: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
cc70: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
cc80: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
cc90: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
cca0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
ccb0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
ccc0: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
ccd0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
cce0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
ccf0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
cd00: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
cd10: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
cd20: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
cd30: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
cd40: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
cd50: 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 4c 69 73  K_SELECT && pLis
cd60: 74 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  t ){.    Expr *p
cd70: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61  First = pList->a
cd80: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a  [iFirst].pExpr;.
cd90: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
cda0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
cdb0: 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d  ert( pFirst->op=
cdc0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
cdd0: 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f  N );.     .    /
cde0: 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45  * Store the SELE
cdf0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
ce00: 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c  pRight so it wil
ce10: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
ce20: 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  n.    ** sqlite3
ce30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29  ExprListDelete()
ce40: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
ce50: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
ce60: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45   = pExpr;.    pE
ce70: 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  xpr = 0;..    /*
ce80: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69   Remember the si
ce90: 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ze of the LHS in
cea0: 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20   iTable so that 
ceb0: 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61  we can check tha
cec0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53  t.    ** the RHS
ced0: 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d   and LHS sizes m
cee0: 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65  atch during code
cef0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a   generation. */.
cf00: 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62      pFirst->iTab
cf10: 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  le = pColumns->n
cf20: 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f  Id;.  }..vector_
cf30: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
cf40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
cf50: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
cf60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
cf70: 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73  ete(db, pColumns
cf80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
cf90: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
cfa0: 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66  the sort order f
cfb0: 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  or the last elem
cfc0: 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ent on the given
cfd0: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f   ExprList..*/.vo
cfe0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
cff0: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45  stSetSortOrder(E
d000: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
d010: 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69  iSortOrder){.  i
d020: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
d030: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
d040: 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c  TE_SO_UNDEFINED<
d050: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41  0 && SQLITE_SO_A
d060: 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  SC>=0 && SQLITE_
d070: 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61  SO_DESC>0 );.  a
d080: 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e  ssert( p->nExpr>
d090: 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74  0 );.  if( iSort
d0a0: 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61  Order<0 ){.    a
d0b0: 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e  ssert( p->a[p->n
d0c0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
d0d0: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  r==SQLITE_SO_ASC
d0e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
d0f0: 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45    }.  p->a[p->nE
d100: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
d110: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
d120: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
d130: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
d140: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
d150: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
d160: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
d170: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
d180: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
d190: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
d1a0: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
d1b0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
d1c0: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
d1d0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
d1e0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
d1f0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
d200: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
d210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
d220: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
d230: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d240: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
d250: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d260: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d270: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d280: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
d290: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
d2a0: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
d2b0: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
d2c0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
d2d0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
d2e0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
d2f0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
d300: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
d310: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
d320: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
d330: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
d340: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
d350: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d360: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
d370: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
d380: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d390: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
d3a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d3b0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
d3c0: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d3d0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
d3e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
d3f0: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
d400: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
d410: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
d420: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
d430: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
d440: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
d450: 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  te ) sqlite3Dequ
d460: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
d470: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d480: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
d490: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
d4a0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
d4b0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
d4c0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
d4d0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
d4e0: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
d4f0: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
d500: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
d510: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
d520: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
d530: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
d540: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
d550: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
d560: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d570: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
d580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
d590: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
d5a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d5c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d5d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d5e0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
d5f0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
d600: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
d610: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
d620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d630: 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64  span to be added
d640: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d650: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d660: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  b;.  assert( pLi
d670: 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  st!=0 || db->mal
d680: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
d690: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d6a0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d6b0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
d6c0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d6d0: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
d6e0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
d6f0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73  Expr>0 );.    as
d700: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
d710: 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d  Failed || pItem-
d720: 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70  >pExpr==pSpan->p
d730: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
d740: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
d750: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
d760: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
d770: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
d780: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
d790: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d7c0: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
d7d0: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
d7e0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
d7f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d800: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
d810: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
d820: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
d830: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
d840: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d850: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
d860: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
d870: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
d880: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
d890: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
d8a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d8b0: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
d8c0: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
d8d0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
d8e0: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
d8f0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d900: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d910: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
d920: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
d930: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
d940: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
d950: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
d960: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
d970: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d980: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
d990: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
d9a0: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
d9b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
d9c0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
d9d0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on list..*/.stat
d9e0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
d9f0: 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74  NE void exprList
da00: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
da10: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
da20: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20  pList){.  int i 
da30: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
da40: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
da50: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
da60: 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73   pList->a;.  ass
da70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
da80: 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  r>0 );.  do{.   
da90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
daa0: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
dab0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
dac0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
dad0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
dae0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
daf0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
db00: 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d      pItem++;.  }
db10: 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a  while( --i>0 );.
db20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
db30: 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
db40: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
db50: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
db60: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
db70: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
db80: 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74  pList ) exprList
db90: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69  DeleteNN(db, pLi
dba0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
dbb0: 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65  turn the bitwise
dbc0: 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e  -OR of all Expr.
dbd0: 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20  flags fields in 
dbe0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70  the given.** Exp
dbf0: 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71  rList..*/.u32 sq
dc00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
dc10: 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  gs(const ExprLis
dc20: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
dc30: 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b   i;.  u32 m = 0;
dc40: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
dc50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dc60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
dc70: 29 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a  ){.       Expr *
dc80: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
dc90: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
dca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
dcb0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c  =0 );.       m |
dcc0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
dcd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
dce0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
dcf0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
dd00: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
dd10: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
dd20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
dd30: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
dd40: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
dd50: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
dd60: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
dd70: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
dd80: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
dd90: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
dda0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
ddb0: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
ddc0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
ddd0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
dde0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
ddf0: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
de00: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
de10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
de20: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
de30: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
de40: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
de50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
de60: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
de70: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
de80: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
de90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
dea0: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29  sTableConstant()
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
dec0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
ded0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
dee0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
def0: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        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 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
df20: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
df30: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
df40: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
df50: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
df60: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
df70: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
df80: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
df90: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
dfa0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
dfb0: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
dfc0: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
dfd0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
dfe0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
dff0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
e000: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
e010: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
e020: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
e030: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
e040: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
e050: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
e060: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
e070: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
e080: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
e090: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
e0a0: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
e0b0: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
e0c0: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
e0d0: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
e0e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e0f0: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
e100: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
e110: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
e120: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
e130: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
e140: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
e150: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
e160: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
e170: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
e180: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
e190: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
e1a0: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
e1b0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
e1c0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
e1d0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
e1e0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
e1f0: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
e200: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
e210: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
e220: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
e230: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
e240: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
e250: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
e260: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
e270: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
e280: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
e290: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
e2a0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
e2b0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
e2c0: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
e2d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
e2e0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
e2f0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
e300: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
e310: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
e320: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
e330: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
e340: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
e350: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
e360: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
e370: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
e380: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
e390: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
e3a0: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
e3b0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
e3c0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
e3d0: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
e3e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
e3f0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
e400: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
e410: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
e420: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
e430: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
e440: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e450: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
e460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e470: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e490: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e4a0: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e4b0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
e4c0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
e4d0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
e4e0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
e4f0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
e500: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e510: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
e520: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e530: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
e540: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
e550: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e560: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
e570: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
e580: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e590: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
e5a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
e5b0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26  lker->eCode==3 &
e5c0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e5d0: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72  =pWalker->u.iCur
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e5f0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e600: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e610: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e620: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e630: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e640: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e650: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
e660: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
e670: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
e680: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
e690: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
e6a0: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
e6b0: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
e6c0: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
e6d0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e6e0: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
e6f0: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
e700: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
e710: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
e720: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
e730: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
e740: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e750: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
e760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
e770: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
e780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
e790: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
e7a0: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
e7b0: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
e7c0: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
e7d0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
e7e0: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
e7f0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
e800: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e810: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e820: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
e840: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
e850: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
e860: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e870: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
e880: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
e890: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
e8a0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
e8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e8c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
e8d0: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
e8e0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
e8f0: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
e900: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
e910: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
e920: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
e930: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e940: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
e950: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
e960: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
e970: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
e980: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
e990: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
e9a0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
e9b0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
e9c0: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
e9d0: 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20  t initFlag, int 
e9e0: 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iCur){.  Walker 
e9f0: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
ea00: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
ea10: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
ea20: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
ea30: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
ea40: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
ea50: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
ea60: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
ea70: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69  onstant;.  w.u.i
ea80: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
ea90: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
eaa0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
eab0: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
eac0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ead0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
eae0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
eaf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
eb00: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
eb10: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
eb20: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
eb30: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
eb40: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
eb50: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
eb60: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
eb70: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
eb80: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
eb90: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
eba0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
ebb0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
ebc0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
ebd0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
ebe0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ebf0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
ec00: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
ec10: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
ec20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
ec30: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
ec40: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
ec50: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
ec60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
ec70: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
ec80: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
ec90: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
eca0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
ecb0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
ecc0: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
ecd0: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
ece0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
ecf0: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
ed00: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
ed10: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
ed20: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
ed30: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
ed40: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
ed50: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
ed60: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
ed70: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
ed80: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
ed90: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
eda0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
edb0: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20  tant.** for any 
edc0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
edd0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
ede0: 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74  sor iCur.  In ot
edf0: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a  her words, the.*
ee00: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  * expression mus
ee10: 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  t not refer to a
ee20: 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ny non-determini
ee30: 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  stic function no
ee40: 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f  r any.** table o
ee50: 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a  ther than iCur..
ee60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ee70: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
ee80: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
ee90: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  Cur){.  return e
eea0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c  xprIsConst(p, 3,
eeb0: 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iCur);.}../*.**
eec0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
eed0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
eee0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
eef0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ef00: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
ef10: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
ef20: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
ef30: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
ef40: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
ef50: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
ef60: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
ef70: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
ef80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
ef90: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
efa0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
efb0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
efc0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
efd0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
efe0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
eff0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
f000: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
f010: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f020: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
f030: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
f040: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
f050: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
f060: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
f070: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
f080: 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
f090: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f0a0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
f0b0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
f0c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
f0d0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
f0e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
f0f0: 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
f100: 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
f110: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
f120: 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
f130: 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
f140: 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
f150: 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
f160: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
f170: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
f180: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
f190: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
f1a0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
f1b0: 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
f1c0: 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
f1d0: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
f1e0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
f1f0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
f200: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
f210: 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
f220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
f230: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f240: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
f250: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
f260: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
f270: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
f280: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
f290: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
f2a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f2b0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
f2c0: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
f2d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
f2e0: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
f2f0: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
f300: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
f310: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
f320: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
f330: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
f340: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
f350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f360: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
f370: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
f380: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
f390: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
f3a0: 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e  rn 0;  /* Can on
f3b0: 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77  ly happen follow
f3c0: 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20  ing on OOM */.. 
f3d0: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
f3e0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
f3f0: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
f400: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
f410: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
f420: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
f430: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
f440: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
f450: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
f460: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
f470: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
f480: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
f490: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
f4a0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
f4b0: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
f4c0: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
f4d0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
f4e0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
f4f0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
f500: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
f510: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
f520: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
f530: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
f540: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
f550: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
f560: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
f570: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
f580: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f590: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
f5a0: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
f5b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f5c0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f5d0: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
f5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
f5f0: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
f600: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
f610: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
f620: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
f630: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f640: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f650: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
f660: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f670: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
f680: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
f690: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
f6a0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
f6b0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
f6c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
f6d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
f6e0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f6f0: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
f700: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
f710: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
f720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f730: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
f740: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
f750: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
f760: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
f770: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
f780: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
f790: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
f7a0: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
f7b0: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
f7c0: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
f7d0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
f7e0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
f7f0: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
f800: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
f810: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
f820: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
f830: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
f840: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
f850: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
f860: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
f870: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
f880: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
f890: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
f8a0: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
f8b0: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
f8c0: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
f8d0: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
f8e0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
f8f0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
f900: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
f910: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
f920: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
f930: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
f940: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
f950: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
f960: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
f970: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
f980: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f990: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
f9a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
f9b0: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
f9c0: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
f9d0: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
f9e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
f9f0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
fa00: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
fa10: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
fa20: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
fa30: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
fa40: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
fa50: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
fa60: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
fa70: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
fa80: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
fa90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
faa0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fab0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
fac0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
fad0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
fae0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
faf0: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
fb00: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
fb10: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
fb20: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
fb30: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
fb40: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
fb50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fb60: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
fb70: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
fb80: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
fb90: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
fba0: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
fbb0: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
fbc0: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
fbd0: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
fbe0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
fbf0: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
fc00: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
fc10: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
fc20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
fc30: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
fc40: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
fc50: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
fc60: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
fc70: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
fc80: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
fc90: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
fca0: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
fcb0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
fcc0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
fcd0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
fce0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
fcf0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
fd00: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
fd10: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fd20: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
fd30: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
fd40: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
fd50: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
fd60: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
fd70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fd80: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
fd90: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
fda0: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
fdb0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
fdc0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
fdd0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
fde0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
fdf0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
fe00: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
fe10: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
fe20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
fe30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fe40: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
fe50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
fe60: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
fe70: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
fe80: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
fe90: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
fea0: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
feb0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
fec0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
fed0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
fee0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
fef0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
ff00: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ff10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
ff20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ff30: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
ff40: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
ff50: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
ff60: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
ff70: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
ff80: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
ff90: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ffa0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
ffb0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
ffc0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ffd0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
ffe0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
fff0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
10000 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
10010 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
10020 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10030 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
10040 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
10050 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
10060 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
10070 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
10080 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
10090 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
100a0 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
100b0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
100c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
100d0 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
100e0 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
100f0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
10100 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10110 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
10120 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
10130 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
10140 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
10150 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
10160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10170 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
10180 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
10190 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
101a0 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
101b0 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
101c0 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
101d0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
101e0 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
101f0 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
10200 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
10210 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
10220 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
10230 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
10240 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10250 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
10260 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
10270 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
10280 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
10290 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
102a0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
102b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
102c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
102d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
102e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
102f0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
10300 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
10310 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
10320 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
10330 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
10340 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
10350 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
10360 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
10370 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
10380 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
10390 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
103a0 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
103b0 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
103c0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
103d0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
103e0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
103f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
10400 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
10410 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
10420 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
10430 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
10440 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10460 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
10470 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
10480 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
10490 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
104a0 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
104b0 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
104c0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
104d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
104e0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
104f0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
10500 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
10510 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
10520 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
10530 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
10540 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10550 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
10560 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
10570 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
10580 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
10590 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
105a0 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
105b0 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
105c0 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
105d0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73  >a[0].pTab;.  as
105e0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
105f0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
10600 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
10610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
10620 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
10630 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
10640 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10650 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
10660 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
10670 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
10680 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
10690 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
106a0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
106b0 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53  =0 );.  /* All S
106c0 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75  ELECT results mu
106d0 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a  st be columns. *
106e0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
106f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10700 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  +){.    Expr *pR
10710 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  es = pEList->a[i
10720 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
10730 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f   pRes->op!=TK_CO
10740 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
10750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
10760 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  s->iTable==pSrc-
10770 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b  >a[0].iCursor );
10780 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65    /* Not a corre
10790 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
107a0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  /.  }.  return p
107b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
107c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
107d0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
107e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
107f0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
10800 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65  te code that che
10810 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  cks the left-mos
10820 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  t column of inde
10830 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20  x table iCur to 
10840 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e  see if.** it con
10850 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65  tains any NULL e
10860 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74  ntries.  Cause t
10870 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72  he register at r
10880 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20  egHasNull to be 
10890 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  set.** to a non-
108a0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43  NULL value if iC
108b0 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ur contains no N
108c0 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67  ULLs.  Cause reg
108d0 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c  ister regHasNull
108e0 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f  .** to be set to
108f0 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f   NULL if iCur co
10900 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
10910 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
10920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10930 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
10940 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e  Flag(Vdbe *v, in
10950 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48  t iCur, int regH
10960 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61  asNull){.  int a
10970 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr1;.  sqlite3V
10980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10990 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48  Integer, 0, regH
109a0 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31  asNull);.  addr1
109b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
109c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
109d0 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
109e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
109f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10a00 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
10a10 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
10a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10a30 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
10a40 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
10a50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10a60 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
10a70 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
10a80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10a90 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
10aa0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
10ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10ac0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
10ad0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
10ae0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
10af0 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  h a list (not a 
10b00 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65  subquery) on the
10b10 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
10b20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  side.  Return TR
10b30 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20  UE if that list 
10b40 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a  is constant..*/.
10b50 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
10b60 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
10b70 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  t(Expr *pIn){.  
10b80 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e  Expr *pLHS;.  in
10b90 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
10ba0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
10bb0 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c  y(pIn, EP_xIsSel
10bc0 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d  ect) );.  pLHS =
10bd0 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70   pIn->pLeft;.  p
10be0 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  In->pLeft = 0;. 
10bf0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78   res = sqlite3Ex
10c00 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e  prIsConstant(pIn
10c10 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  );.  pIn->pLeft 
10c20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e  = pLHS;.  return
10c30 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   res;.}.#endif..
10c40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10c50 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
10c60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
10c70 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
10c80 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54  ) operator..** T
10c90 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20  he pX parameter 
10ca0 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  is the expressio
10cb0 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  n on the RHS of 
10cc0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
10cd0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
10ce0 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74  be either a list
10cf0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
10d00 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a  or a subquery..*
10d10 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
10d20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10d30 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
10d40 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  e a b-tree objec
10d50 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  t that can.** be
10d60 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20   used either to 
10d70 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
10d80 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73  hip in the RHS s
10d90 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
10da0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
10db0 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52  members of the R
10dc0 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67  HS set, skipping
10dd0 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
10de0 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f  ** A cursor is o
10df0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
10e00 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
10e10 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  is the RHS of th
10e20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
10e30 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20   and pX->iTable 
10e40 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
10e50 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73  dex of that curs
10e60 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  or..**.** The re
10e70 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
10e80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
10e90 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
10ea0 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
10eb0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
10ec0 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20  INDEX_ROWID     
10ed0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10ee0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
10ef0 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
10f00 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
10f10 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72  X_ASC  - The cur
10f20 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
10f30 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
10f40 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
10f50 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d  DEX_INDEX_DESC -
10f60 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
10f70 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63  opened on a desc
10f80 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
10f90 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
10fa0 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72         - The cur
10fb0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
10fc0 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
10fd0 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
11000 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
11010 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  **   IN_INDEX_NO
11020 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75  OP       - No cu
11030 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74  rsor was allocat
11040 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  ed.  The IN oper
11050 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  ator must be.** 
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e          implemen
11080 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63  ted as a sequenc
11090 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
110a0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
110b0 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74  ing b-tree might
110c0 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
110d0 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70  RHS expression p
110e0 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  X is a simple.**
110f0 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61   subquery such a
11100 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
11110 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c  ECT <column1>, <
11120 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d  column2>... FROM
11130 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
11140 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11150 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11160 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
11170 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
11180 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
11190 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
111a0 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
111b0 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
111c0 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
111d0 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
111e0 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
111f0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
11200 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
11210 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
11220 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46  e..**.** The inF
11230 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d  lags parameter m
11240 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63  ust contain exac
11250 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  tly one of the b
11260 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
11270 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
11280 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66  _INDEX_LOOP.  If
11290 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e   inFlags contain
112a0 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
112b0 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74  MBERSHIP, then t
112c0 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
112d0 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
112e0 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65  for a.** fast me
112f0 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20  mbership test.  
11300 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45  When the IN_INDE
11310 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65  X_LOOP bit is se
11320 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64  t, the.** IN ind
11330 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ex will be used 
11340 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  to loop over all
11350 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52   values of the R
11360 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20  HS of the.** IN 
11370 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
11380 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
11390 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
113a0 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
113b0 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
113c0 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
113d0 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
113e0 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
113f0 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
11400 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
11410 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
11420 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
11430 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
11440 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67  ed columns are g
11450 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
11460 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
11470 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
11480 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
11490 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74  ARY KEY or due t
114a0 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f  o.** a UNIQUE co
114b0 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65  nstraint or inde
114c0 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  x..**.** When IN
114d0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
114e0 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
114f0 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
11500 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
11510 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
11520 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61  ip tests) then a
11530 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
11540 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
11550 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
11560 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ns> is a single 
11570 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11580 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e  KEY column or an
11590 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62   .** index can b
115a0 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65  e found with the
115b0 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75   specified <colu
115c0 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74  mns> as its left
115d0 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -most..**.** If 
115e0 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
115f0 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
11600 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
11610 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
11620 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
11630 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
11640 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
11650 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
11660 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
11670 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
11680 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
11690 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
116a0 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
116b0 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
116c0 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
116d0 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
116e0 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
116f0 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
11700 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
11710 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
11720 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
11730 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
11740 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
11750 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
11760 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
11770 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
11780 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
11790 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
117a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
117b0 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
117c0 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
117d0 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
117e0 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
117f0 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
11800 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
11810 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
11820 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
11830 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
11840 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
11850 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
11860 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
11870 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
11880 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
11890 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
118a0 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
118b0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
118c0 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
118d0 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
118e0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
118f0 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
11900 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
11910 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
11920 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
11930 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
11940 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
11950 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
11960 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
11970 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
11980 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
11990 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
119a0 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
119b0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
119c0 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
119d0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
119e0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
119f0 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
11a00 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
11a10 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
11a20 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
11a30 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
11a40 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72  If the aiMap par
11a50 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ameter is not NU
11a60 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e  LL, it must poin
11a70 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f  t to an array co
11a80 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20  ntaining.** one 
11a90 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68  element for each
11aa0 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
11ab0 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
11ac0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20  tatement on the 
11ad0 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e  RHS.** of the IN
11ae0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20  (...) operator. 
11af0 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f  The i'th entry o
11b00 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70  f the array is p
11b10 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
11b20 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74  e.** offset of t
11b30 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
11b40 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
11b50 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74   i'th column ret
11b60 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  urned by the.** 
11b70 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d  SELECT. For exam
11b80 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72  ple, if the expr
11b90 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63  ession and selec
11ba0 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a  ted index are:.*
11bb0 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49  *.**   (?,?,?) I
11bc0 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20  N (SELECT a, b, 
11bd0 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20  c FROM t1).**   
11be0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
11bf0 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a  ON t1(b, c, a);.
11c00 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70  **.** then aiMap
11c10 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  [] is populated 
11c20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a  with {2, 0, 1}..
11c30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11c40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11c50 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
11c60 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  nIndex(.  Parse 
11c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11c80 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11c90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
11ca0 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20  r *pX,          
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
11cc0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
11cd0 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f  RHS) of the IN o
11ce0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32  perator */.  u32
11cf0 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20   inFlags,       
11d00 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e          /* IN_IN
11d10 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45  DEX_LOOP, _MEMBE
11d20 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e  RSHIP, and/or _N
11d30 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20  OOP_OK */.  int 
11d40 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20  *prRhsHasNull,  
11d50 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
11d60 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20  er holding NULL 
11d70 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74  status.  See not
11d80 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d  es */.  int *aiM
11d90 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
11da0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
11db0 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20  om Index fields 
11dc0 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f  to RHS fields */
11dd0 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  .){.  Select *p;
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11e00 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
11e10 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
11e20 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
11e30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e50 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
11e60 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
11e70 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
11e80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
11e90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
11ea0 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
11eb0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
11ec0 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ee0 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
11ef0 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
11f00 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
11f10 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11f20 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
11f30 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
11f40 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
11f50 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
11f60 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
11f70 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
11f80 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
11f90 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  !=0;..  /* If th
11fa0 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e  e RHS of this IN
11fb0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69  (...) operator i
11fc0 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20  s a SELECT, and 
11fd0 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20  if it matters . 
11fe0 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11ff0 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ot the SELECT re
12000 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  sult contains NU
12010 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b  LL values, check
12020 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72   whether.  ** or
12030 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74   not NULL is act
12040 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28  ually possible (
12050 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66  it may not be, f
12060 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20  or example, due 
12070 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c  .  ** to NOT NUL
12080 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  L constraints in
12090 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66   the schema). If
120a0 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20   no NULL values 
120b0 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20  are possible,.  
120c0 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e  ** set prRhsHasN
120d0 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20  ull to 0 before 
120e0 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a  continuing.  */.
120f0 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
12100 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73  ll && (pX->flags
12110 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
12120 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12130 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
12140 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c  ist = pX->x.pSel
12150 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
12160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12170 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12180 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12190 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
121a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
121b0 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pr) ) break;.   
121c0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45   }.    if( i==pE
121d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
121e0 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c       prRhsHasNul
121f0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
12200 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
12210 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
12220 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
12230 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
12240 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
12250 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
12260 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
12270 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
12280 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
12290 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66   table.  */.  if
122a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
122b0 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64  0 && (p = isCand
122c0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58  idateForInOpt(pX
122d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
122e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
122f0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
12300 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12310 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
12320 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
12350 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
12360 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12390 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
123a0 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  b */.    ExprLis
123b0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
123c0 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e  EList;.    int n
123d0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
123e0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
123f0 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
12400 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
12410 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
12420 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
12430 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
12440 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
12450 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
12460 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
12470 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
12480 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
12490 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124b0 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
124c0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
124d0 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
124e0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
124f0 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
12500 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
12510 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
12520 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
12530 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
12540 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
12550 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
12560 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
12570 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
12580 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
12590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
125a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
125b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
125c0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
125d0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  ;..    assert(v)
125e0 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ;  /* sqlite3Get
125f0 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79  Vdbe() has alway
12600 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
12610 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  y called */.    
12620 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
12630 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
12640 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
12650 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  .      /* The "x
12660 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69   IN (SELECT rowi
12670 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63  d FROM table)" c
12680 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ase */.      int
12690 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
126a0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
126b0 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64  _Once);.      Vd
126c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
126d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
126e0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
126f0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
12700 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
12710 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
12720 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
12730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12740 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
12750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12760 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
12790 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
127a0 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
127b0 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20  ty_ok = 1;.     
127c0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f   int i;..      /
127d0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
127e0 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
127f0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
12800 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20  erform each .   
12810 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
12820 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
12830 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
12840 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
12850 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  able.      ** on
12860 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
12870 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  IN operator.  If
12880 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   it not, it is n
12890 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20  ot possible to. 
128a0 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20       ** use any 
128b0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53  index of the RHS
128c0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
128d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
128e0 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  pr && affinity_o
128f0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
12900 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
12910 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
12920 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
12930 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
12940 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74  nt iCol = pEList
12950 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[i].pExpr->iC
12960 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63  olumn;.        c
12970 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c  har idxaff = sql
12980 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41  ite3TableColumnA
12990 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f  ffinity(pTab,iCo
129a0 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65  l); /* RHS table
129b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
129c0 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65   cmpaff = sqlite
129d0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
129e0 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a  (pLhs, idxaff);.
129f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12a00 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
12a10 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
12a20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63       testcase( c
12a30 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  mpaff==SQLITE_AF
12a40 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
12a50 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66    switch( cmpaff
12a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
12a70 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
12a80 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB:.            
12a90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12aa0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
12ab0 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20  _TEXT:.         
12ac0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d     /* sqlite3Com
12ad0 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f  pareAffinity() o
12ae0 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54  nly returns TEXT
12af0 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   if one side or 
12b00 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
12b10 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20  ** other has no 
12b20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65  affinity and the
12b30 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54   other side is T
12b40 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20  EXT.  Hence,.   
12b50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
12b60 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70  only way for cmp
12b70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69  aff to be TEXT i
12b80 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20  s for idxaff to 
12b90 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20  be TEXT.        
12ba0 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74      ** and for t
12bb0 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c  he term on the L
12bc0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20  HS of the IN to 
12bd0 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79  have no affinity
12be0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
12bf0 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d   assert( idxaff=
12c00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
12c10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
12c20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12c30 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
12c40 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f        affinity_o
12c50 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  k = sqlite3IsNum
12c60 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
12c70 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aff);.        }.
12c80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
12c90 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
12ca0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  {.        /* Sea
12cb0 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
12cc0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
12cd0 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69  ill work for thi
12ce0 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
12cf0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
12d00 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
12d10 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
12d20 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
12d30 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42  xt){.          B
12d40 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20  itmask colUsed; 
12d50 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
12d60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  of the index use
12d70 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42  d */.          B
12d80 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20  itmask mCol;    
12d90 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72       /* Mask for
12da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
12db0 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  umn */.         
12dc0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
12dd0 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69  mn<nExpr ) conti
12de0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  nue;.          /
12df0 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d  * Maximum nColum
12e00 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20  n is BMS-2, not 
12e10 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77  BMS-1, so that w
12e20 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20  e can compute.  
12e30 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41          ** BITMA
12e40 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75  SK(nExpr) withou
12e50 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f  t overflowing */
12e60 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
12e70 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ase( pIdx->nColu
12e80 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20  mn==BMS-2 );.   
12e90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12ea0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
12eb0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  BMS-1 );.       
12ec0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
12ed0 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f  lumn>=BMS-1 ) co
12ee0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12ef0 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71    if( mustBeUniq
12f00 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ue ){.          
12f10 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79    if( pIdx->nKey
12f20 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  Col>nExpr.      
12f30 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e         ||(pIdx->
12f40 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26  nColumn>nExpr &&
12f50 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
12f60 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20  pIdx)).         
12f70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
12f80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
12f90 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
12fa0 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20  not unique over 
12fb0 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d  the IN RHS colum
12fc0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ns */.          
12fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
12fe0 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c    .          col
12ff0 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43  Used = 0;   /* C
13000 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20  olumns of index 
13010 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  used so far */. 
13020 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
13030 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
13050 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
13060 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
13070 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
13080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  );.            E
13090 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
130a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
130b0 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
130c0 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
130d0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
130e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
130f0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
13100 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
13110 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61    .            a
13120 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c  ssert( pReq!=0 |
13130 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d  | pRhs->iColumn=
13140 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61  =XN_ROWID || pPa
13150 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20  rse->nErr );.   
13160 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
13170 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  ; j<nExpr; j++){
13180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13190 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
131a0 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c  n[j]!=pRhs->iCol
131b0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
131d0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f  sert( pIdx->azCo
131e0 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20  ll[j] );.       
131f0 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21         if( pReq!
13200 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
13210 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65  ICmp(pReq->zName
13220 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
13230 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
13240 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
13250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
13260 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
13270 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13290 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
132a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
132b0 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42      mCol = MASKB
132c0 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  IT(j);.         
132d0 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f     if( mCol & co
132e0 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f  lUsed ) break; /
132f0 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73  * Each column us
13300 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ed only once */.
13310 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
13320 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20  sed |= mCol;.   
13330 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d           if( aiM
13340 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  ap ) aiMap[i] = 
13350 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  j;.          }. 
13360 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65   .          asse
13370 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20  rt( i==nExpr || 
13380 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49  colUsed!=(MASKBI
13390 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20  T(nExpr)-1) );. 
133a0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c           if( col
133b0 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e  Used==(MASKBIT(n
133c0 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  Expr)-1) ){.    
133d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
133e0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
133f0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
13400 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  e index pIdx is 
13410 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  usable */.      
13420 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
13430 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13440 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
13450 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13460 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13470 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
13480 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13490 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
134a0 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30 2c  P_Explain, 0, 0,
134b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
134c0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
134d0 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44 45  (db, "USING INDE
134e0 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
134f0 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
13500 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
13510 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 23    P4_DYNAMIC);.#
13520 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
13530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13540 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
13550 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e  ad, iTab, pIdx->
13560 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
13570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13580 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
13590 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
135a0 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
135b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
135c0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
135d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
135e0 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  rt( IN_INDEX_IND
135f0 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e  EX_DESC == IN_IN
13600 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20  DEX_INDEX_ASC+1 
13610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
13620 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13630 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78  INDEX_ASC + pIdx
13640 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b  ->aSortOrder[0];
13650 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
13660 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
13670 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
13680 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
13690 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
136a0 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b          i64 mask
136b0 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b   = (1<<nExpr)-1;
136c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
136d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
136e0 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
136f0 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20  nsUsed, .       
13700 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c             iTab,
13710 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73   0, 0, (u8*)&mas
13720 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65  k, P4_INT64);.#e
13730 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
13740 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
13750 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13760 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
13770 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b   if( nExpr==1 ){
13780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13790 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
137a0 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20  llFlag(v, iTab, 
137b0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  *prRhsHasNull);.
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
137d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
137e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
137f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13800 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
13810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f     }.        } /
13820 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * End loop over 
13830 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20  indexes */.     
13840 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66   } /* End if( af
13850 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20  finity_ok ) */. 
13860 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e     } /* End if n
13870 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65  ot an rowid inde
13880 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20  x */.  } /* End 
13890 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d  attempt to optim
138a0 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  ize using an ind
138b0 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e  ex */..  /* If n
138c0 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e  o preexisting in
138d0 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
138e0 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75   for the IN clau
138f0 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49  se.  ** and IN_I
13900 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20  NDEX_NOOP is an 
13910 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20  allowed reply.  
13920 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f  ** and the RHS o
13930 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13940 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74  r is a list, not
13950 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a   a subquery.  **
13960 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20   and the RHS is 
13970 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20  not constant or 
13980 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
13990 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
139a0 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
139b0 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
139c0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
139d0 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74   evaluate.  ** t
139e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
139f0 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  o return IN_INDE
13a00 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69  X_NOOP..  */.  i
13a10 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26  f( eType==0.   &
13a20 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  & (inFlags & IN_
13a30 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20  INDEX_NOOP_OK). 
13a40 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
13a50 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
13a60 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21  Select).   && (!
13a70 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
13a80 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58  nstant(pX) || pX
13a90 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
13aa0 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54  <=2).  ){.    eT
13ab0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e  ype = IN_INDEX_N
13ac0 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
13ad0 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
13ae0 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  /* Could not fin
13af0 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
13b00 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
13b10 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
13b20 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
13b30 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
13b40 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
13b50 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
13b60 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
13b70 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75      u32 savedNQu
13b80 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
13b90 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
13ba0 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
13bb0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70  ll = 0;.    eTyp
13bc0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
13bd0 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67  ;.    if( inFlag
13be0 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
13bf0 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  P ){.      pPars
13c00 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
13c10 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
13c20 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
13c30 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
13c40 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
13c50 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
13c60 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
13c70 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
13c80 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13c90 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
13ca0 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
13cb0 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
13cc0 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
13cd0 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
13ce0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
13cf0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
13d00 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
13d10 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
13d20 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
13d30 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
13d40 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
13d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
13d60 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
13d70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
13d80 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
13d90 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
13da0 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
13db0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
13dc0 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
13dd0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
13de0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
13df0 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
13e00 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
13e10 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
13e20 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
13e30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
13e40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13e50 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72  UBQUERY./*.** Ar
13e60 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20  gument pExpr is 
13e70 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28  an (?, ?...) IN(
13e80 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
13e90 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
13ea0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
13eb0 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74   returns a nul-t
13ec0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
13ed0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20   containing .** 
13ee0 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74  the affinities t
13ef0 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61  o be used for ea
13f00 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
13f10 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
13f20 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
13f30 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
13f40 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
13f50 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74  ure that the ret
13f60 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  urned.** string 
13f70 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
13f80 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
13f90 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  3DbFree()..*/.st
13fa0 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49  atic char *exprI
13fb0 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  NAffinity(Parse 
13fc0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13fd0 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  Expr){.  Expr *p
13fe0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
13ff0 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20  eft;.  int nVal 
14000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
14010 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
14020 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
14030 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  t = (pExpr->flag
14040 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
14050 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ) ? pExpr->x.pSe
14060 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72  lect : 0;.  char
14070 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72   *zRet;..  asser
14080 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
14090 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20  _IN );.  zRet = 
140a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
140b0 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  aw(pParse->db, n
140c0 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52  Val+1);.  if( zR
140d0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
140e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
140f0 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
14100 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c    Expr *pA = sql
14110 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
14120 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
14130 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20 3d  ;.      char a =
14140 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
14150 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20  nity(pA);.      
14160 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
14170 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
14180 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14190 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d  ffinity(pSelect-
141a0 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
141b0 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d  xpr, a);.      }
141c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52  else{.        zR
141d0 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20  et[i] = a;.     
141e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65   }.    }.    zRe
141f0 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a  t[nVal] = '\0';.
14200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
14210 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  t;.}.#endif..#if
14220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14230 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
14240 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20 6f  Load the Parse o
14250 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
14260 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
14270 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  nt with an error
14280 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20   .** message of 
14290 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
142a0 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
142b0 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
142c0 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f  - expected M".*/
142d0 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
142e0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50  SubselectError(P
142f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14300 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e  t nActual, int n
14310 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74  Expect){.  const
14320 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73   char *zFmt = "s
14330 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
14340 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  s %d columns - e
14350 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73  xpected %d";.  s
14360 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14370 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63  Parse, zFmt, nAc
14380 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a  tual, nExpect);.
14390 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
143a0 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  Expression pExpr
143b0 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68 61   is a vector tha
143c0 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
143d0 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65  in a context whe
143e0 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  re.** it is not 
143f0 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45  permitted. If pE
14400 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c  xpr is a sub-sel
14410 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73  ect vector, this
14420 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61   routine .** loa
14430 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ds the Parse obj
14440 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73 61  ect with a messa
14450 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
14460 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
14470 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
14480 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
14490 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66   1".**.** Or, if
144a0 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61 72   it is a regular
144b0 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a   scalar vector:.
144c0 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c  **.**   "row val
144d0 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20  ue misused".*/  
144e0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65   .void sqlite3Ve
144f0 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72  ctorErrorMsg(Par
14500 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
14510 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65   *pExpr){.#ifnde
14520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
14530 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78  BQUERY.  if( pEx
14540 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
14550 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  IsSelect ){.    
14560 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
14570 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45  Error(pParse, pE
14580 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
14590 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31  pEList->nExpr, 1
145a0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
145b0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
145c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
145d0 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
145e0 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  used");.  }.}../
145f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14600 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
14610 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
14620 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
14630 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a  ession, EXISTS,.
14640 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ** or IN operato
14650 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
14660 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
14670 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
14680 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
14690 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
146a0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
146b0 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
146c0 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
146d0 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
146e0 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
146f0 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
14700 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
14710 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
14720 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
14730 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
14740 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
14750 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
14760 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
14770 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
14780 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
14790 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
147a0 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
147b0 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
147c0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
147d0 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
147e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70  n-zero, then exp
147f0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
14800 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
14810 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
14820 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c   "<rowid> IN (?,
14830 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c   ?, ?)", where <
14840 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65  rowid> is a refe
14850 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65  rence.** to some
14860 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c   integer key col
14870 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42  umn of a table B
14880 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
14890 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69  ase, use an.** i
148a0 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20  ntkey B-Tree to 
148b0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
148c0 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20   IN(...) values 
148d0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
148e0 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29  sual.** (slower)
148f0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
14900 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a   keys B-Tree..**
14910 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e  .** If rMayHaveN
14920 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ull is non-zero,
14930 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
14940 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
14950 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20  s an IN.** (not 
14960 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
14970 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65  TS) and that the
14980 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61   RHS might conta
14990 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c  ins NULLs..** Al
149a0 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
149b0 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
149c0 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  e the register g
149d0 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
149e0 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e  Null.** to NULL.
149f0 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
14a00 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  es will take car
14a10 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
14a20 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76  is register.** v
14a30 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
14a40 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
14a50 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
14a60 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
14a70 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
14a80 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
14a90 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
14aa0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
14ab0 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75  For a multi-colu
14ac0 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72  mn SELECT, the r
14ad0 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
14ae0 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a  in a contiguous.
14af0 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  ** array of regi
14b00 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72 65  sters and the re
14b10 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
14b20 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  e register of th
14b30 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72  e left-most.** r
14b40 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52  esult column.  R
14b50 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f  eturn 0 for IN o
14b60 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61  perators or if a
14b70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
14b80 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14b90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
14ba0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
14bb0 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
14bc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14bd0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14be0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
14bf0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
14c00 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
14c10 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
14c20 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
14c30 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c  nt rHasNullFlag,
14c40 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
14c50 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
14c60 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
14c70 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
14c80 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
14c90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
14ca0 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
14cb0 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
14cc0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d  d */.){.  int jm
14cd0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
14d00 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
14d10 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
14d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14d40 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20  egister storing 
14d50 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56  resulting */.  V
14d60 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
14d70 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14d80 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
14d90 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
14da0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14db0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a  ePush(pParse);..
14dc0 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74    /* The evaluat
14dd0 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58  ion of the IN/EX
14de0 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74  ISTS/SELECT must
14df0 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65   be repeated eve
14e00 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20  ry time it.  ** 
14e10 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
14e20 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
14e30 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
14e40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
14e50 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
14e60 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
14e70 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
14e80 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
14e90 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
14ea0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
14eb0 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
14ec0 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
14ed0 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
14ee0 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
14ef0 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
14f00 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
14f10 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
14f20 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
14f30 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
14f40 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
14f50 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
14f60 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
14f70 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
14f80 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
14f90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14fa0 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
14fb0 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66  ct) ){.    jmpIf
14fc0 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65  Dynamic = sqlite
14fd0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14fe0 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
14ff0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23  erage(v);.  }..#
15000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15010 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
15020 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
15030 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
15040 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
15050 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
15060 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
15070 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
15080 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
15090 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
150a0 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
150b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
150c0 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
150d0 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ",.        pPars
150e0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
150f0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
15100 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15110 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
15120 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
15130 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
15140 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
15150 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
15160 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
15170 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
15180 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
151b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
151c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
151d0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
151e0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
151f0 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
15200 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
15210 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
15220 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
15230 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
15240 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
15250 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20  nt nVal;        
15260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
15270 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65  ze of vector pLe
15280 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20  ft */.      .   
15290 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
152a0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
152b0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
152c0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c  sert( !isRowid |
152d0 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20  | nVal==1 );..  
152e0 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
152f0 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
15300 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
15310 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
15320 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
15330 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
15340 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
15350 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
15360 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
15370 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
15380 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  h index keys rep
15390 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
153a0 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a  sults from the .
153b0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
153c0 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
153d0 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
153e0 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
153f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
15400 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
15410 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
15420 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
15430 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
15440 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
15450 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
15460 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
15470 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
15480 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
15490 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
154a0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
154b0 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
154c0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
154d0 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
154e0 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
154f0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
15500 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
15510 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
15520 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
15530 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
15540 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
15550 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
15560 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
15570 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
15580 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
15590 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
155a0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
155b0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
155c0 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
155d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155e0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
155f0 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20  emeral, .       
15600 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
15610 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61  , (isRowid?0:nVa
15620 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  l));.      pKeyI
15630 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
15640 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
15650 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
15660 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20  db, nVal, 1);.. 
15670 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
15680 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15690 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
156a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
156b0 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
156c0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
156d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
156e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
156f0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
15700 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
15710 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
15720 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
15730 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
15740 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
15750 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
15760 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
15770 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
15780 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
15790 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
157a0 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
157b0 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
157c0 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
157d0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   );.        /* I
157e0 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48  f the LHS and RH
157f0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
15800 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ator do not matc
15810 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  h, that.        
15820 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61  ** error will ha
15830 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c  ve been caught l
15840 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65  ong before we re
15850 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ach this point. 
15860 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  */.        if( A
15870 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
15880 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
15890 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
158a0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
158b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
158c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
158d0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
158e0 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
158f0 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
15900 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
15910 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
15920 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
15930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  );.          pSe
15940 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
15950 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
15960 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73  case( pSelect->s
15970 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
15980 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
15990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
159a0 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
159b0 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
159c0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
159d0 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
159e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
159f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
15a00 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
15a10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15a20 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
15a30 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
15a40 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
15a50 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
15a60 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
15a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
15a80 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
15a90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
15aa0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
15ab0 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
15ac0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
15ad0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
15ae0 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
15af0 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
15b00 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
15b10 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
15b20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15b30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
15b40 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
15b50 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
15b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
15b70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
15b80 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
15b90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ) );.          f
15ba0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
15bb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15bc0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
15bd0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
15be0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
15bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65  .            pKe
15c00 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
15c10 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
15c20 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15c40 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
15c50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20  ->a[i].pExpr.   
15c60 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
15c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15c80 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
15c90 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
15ca0 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
15cb0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
15cc0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
15cd0 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
15ce0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
15cf0 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
15d00 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
15d10 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
15d20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
15d30 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
15d40 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
15d50 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
15d60 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
15d70 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
15d80 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
15d90 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
15da0 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
15db0 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
15dc0 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
15dd0 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
15de0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
15df0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
15e00 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
15e10 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ty;            /
15e20 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
15e30 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
15e40 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
15e50 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
15e60 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
15e70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
15e80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
15e90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
15ea0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
15eb0 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20   r2, r3;..      
15ec0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
15ed0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
15ee0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  (pLeft);.       
15ef0 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
15f00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
15f10 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
15f20 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
15f30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
15f40 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
15f50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15f60 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
15f70 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
15f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
15f90 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
15fa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
15fb0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
15fc0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
15fd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
15fe0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
15ff0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
16000 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
16010 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
16020 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16030 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
16040 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
16050 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16060 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
16070 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
16080 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16090 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
160a0 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
160b0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
160c0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
160d0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
160e0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
160f0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
16100 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
16110 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
16120 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
16130 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
16140 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
16150 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
16160 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
16170 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
16180 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
16190 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
161a0 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
161b0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
161c0 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
161d0 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
161e0 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
161f0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
16200 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
16210 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
16220 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
16230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16240 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
16250 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
16260 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
16270 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
16280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16290 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
162a0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
162b0 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
162c0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
162d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
162e0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
162f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
16300 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
16310 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
16320 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
16330 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
16340 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
16350 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
16360 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
16370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16380 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16390 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
163a0 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
163b0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
163c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
163d0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
163e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
163f0 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
16400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
16410 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
16420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
16440 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
16470 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16480 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
16490 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
164a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
164b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
164c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
164d0 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
164e0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
164f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
16500 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
16510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16520 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
16530 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
16540 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
16560 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16570 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
16580 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
16590 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
165a0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
165b0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
165c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
165d0 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
165e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16610 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16620 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
16630 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16640 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16650 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
16660 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
16670 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16680 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
16690 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
166a0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
166b0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
166c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
166d0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
166e0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
166f0 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
16700 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
16710 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28   /* Case 3:    (
16720 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
16730 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ...).      **   
16740 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28    or:    EXISTS(
16750 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
16760 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ...).      **.  
16770 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c      ** For a SEL
16780 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
16790 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76 61  de to put the va
167a0 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  lues for all col
167b0 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a  umns of.      **
167c0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
167d0 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
167e0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
167f0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
16800 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
16810 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
16820 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16830 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
16840 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20  XISTS, write an 
16850 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
16860 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
16870 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sts).      ** in
16880 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
16890 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
168a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
168b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
168c0 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
168d0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
168e0 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
168f0 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20  IT 1".  Any .   
16900 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
16910 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61  g limit is disca
16920 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  rded in place of
16930 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31   the new LIMIT 1
16940 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16950 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
16980 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
16990 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
169a0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
169d0 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
169e0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
169f0 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16a20 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
16a30 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
16a40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
16a50 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
16a60 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
16a70 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
16a80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16a90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
16aa0 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
16ab0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
16ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
16ad0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16ae0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16af0 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
16b00 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
16b10 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67  lect;.      nReg
16b20 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
16b30 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
16b40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
16b50 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
16b60 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
16b70 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
16b80 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
16b90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
16ba0 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
16bb0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
16bc0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
16bd0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16be0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
16bf0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
16c00 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
16c10 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
16c20 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
16c30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16c40 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
16c50 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
16c60 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
16c70 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
16c80 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
16c90 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
16ca0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16cb0 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
16cc0 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
16cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16ce0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16cf0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
16d00 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
16d10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16d20 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
16d30 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
16d40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16d50 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
16d60 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
16d70 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
16d80 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
16d90 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
16da0 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45  rse->db, TK_INTE
16db0 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
16de0 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
16df0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
16e00 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
16e10 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sel->selFlags &=
16e20 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b   ~SF_MultiValue;
16e30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
16e40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16e50 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
16e60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16e70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16e80 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
16e90 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
16ea0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
16eb0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
16ec0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16ee0 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
16ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
16f00 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
16f10 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
16f20 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
16f30 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
16f40 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
16f50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16f60 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
16f70 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
16f80 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16f90 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
16fa0 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
16fb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16fc0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
16fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16fe0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
16ff0 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49  Expr pIn is an I
17000 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
17010 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
17020 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
17030 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
17040 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
17050 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20  e IN() operator 
17060 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
17070 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d  ber of .** colum
17080 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72  ns as the vector
17090 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c   on the LHS. Or,
170a0 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
170b0 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a  he IN() is not .
170c0 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20  ** a sub-query, 
170d0 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20  that the LHS is 
170e0 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65  a vector of size
170f0 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
17100 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61  e3ExprCheckIN(Pa
17110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
17120 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  r *pIn){.  int n
17130 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
17140 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
17150 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  In->pLeft);.  if
17160 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20  ( (pIn->flags & 
17170 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17180 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
17190 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
171a0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
171b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
171c0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
171d0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
171e0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
171f0 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
17200 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
17210 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
17220 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
17230 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f      sqlite3Vecto
17240 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  rErrorMsg(pParse
17250 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  , pIn->pLeft);. 
17260 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
17270 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
17280 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
17290 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
172a0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
172b0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49  te code for an I
172c0 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  N expression..**
172d0 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53  .**      x IN (S
172e0 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20  ELECT ...).**   
172f0 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20     x IN (value, 
17300 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  value, ...).**.*
17310 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  * The left-hand 
17320 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20  side (LHS) is a 
17330 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72  scalar or vector
17340 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
17350 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
17360 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61   side (RHS) is a
17370 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
17380 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76  or more scalar v
17390 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73  alues, or a.** s
173a0 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  ubquery.  If the
173b0 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65   RHS is a subque
173c0 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ry, the number o
173d0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
173e0 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74   must.** match t
173f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
17400 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  umns in the vect
17410 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20  or on the LHS.  
17420 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a  If the RHS is.**
17430 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
17440 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20  s, the LHS must 
17450 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a  be a scalar. .**
17460 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61  .** The IN opera
17470 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74  tor is true if t
17480 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20  he LHS value is 
17490 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
174a0 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65   the RHS..** The
174b0 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65   result is false
174c0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64   if the LHS is d
174d0 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e  efinitely not in
174e0 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a   the RHS.  The .
174f0 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  ** result is NUL
17500 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63  L if the presenc
17510 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
17520 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62  the RHS cannot b
17530 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  e .** determined
17540 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a   due to NULLs..*
17550 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17560 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
17570 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64   that jumps to d
17580 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
17590 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
175a0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
175b0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
175c0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
175d0 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
175e0 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
175f0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
17600 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
17610 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
17620 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
17630 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
17640 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
17650 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a  all through..**.
17660 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72  ** See the separ
17670 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  ate in-operator.
17680 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  md documentation
17690 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e   file in the can
176a0 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65  onical.** SQLite
176b0 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72   source tree for
176c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
176d0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
176e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
176f0 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
17700 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17710 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
17720 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
17730 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
17740 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
17750 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
17760 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
17770 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
17780 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
17790 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
177a0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
177b0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
177c0 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
177d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
177e0 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
177f0 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
17800 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
17810 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
17820 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
17830 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
17840 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
17850 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
17860 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
17870 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
17880 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
17890 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lhs;            
178a0 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20   /* Register(s) 
178b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20  holding the LHS 
178c0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
178d0 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20  rLhsOrig;       
178e0 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20    /* LHS values 
178f0 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72  prior to reorder
17900 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a  ing by aiMap[] *
17910 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
17920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
17930 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
17940 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
17950 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20  nt *aiMap = 0;  
17960 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d       /* Map from
17970 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f   vector field to
17980 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f   index column */
17990 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20  .  char *zAff = 
179a0 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69  0;       /* Affi
179b0 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20  nity string for 
179c0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20  comparisons */. 
179d0 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20   int nVector;   
179e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
179f0 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68  f vectors for th
17a00 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
17a10 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20  /.  int iDummy; 
17a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d            /* Dum
17a30 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  my parameter to 
17a40 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29  exprCodeVector()
17a50 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
17a60 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
17a70 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
17a80 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
17a90 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17aa0 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75       /* loop cou
17ab0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65  nter */.  int de
17ac0 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20  stStep2;        
17ad0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
17ae0 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e   when NULLs seen
17af0 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20   in step 2 */.  
17b00 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20  int destStep6 = 
17b10 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  0;    /* Start o
17b20 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20  f code for Step 
17b30 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
17b40 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20  ruthOp;      /* 
17b50 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64  Address of opcod
17b60 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  e that determine
17b70 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65  s the IN is true
17b80 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f   */.  int destNo
17b90 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a  tNull;      /* J
17ba0 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f  ump here if a co
17bb0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
17bc0 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a  true in step 6 *
17bd0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
17be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
17bf0 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c   of the step-6 l
17c00 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74  oop */ ..  pLeft
17c10 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
17c20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
17c30 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65  prCheckIN(pParse
17c40 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72  , pExpr) ) retur
17c50 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72  n;.  zAff = expr
17c60 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
17c70 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65  e, pExpr);.  nVe
17c80 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
17c90 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
17ca0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69  pr->pLeft);.  ai
17cb0 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Map = (int*)sqli
17cc0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
17cd0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
17ce0 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65  b, nVector*(size
17cf0 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
17d00 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b  (char)) + 1.  );
17d10 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
17d20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17d30 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78  ) goto sqlite3Ex
17d40 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
17d50 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  or;..  /* Attemp
17d60 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
17d70 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
17d80 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
17d90 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
17da0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
17db0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
17dc0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
17dd0 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
17de0 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
17df0 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
17e00 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
17e10 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
17e20 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
17e30 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
17e40 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
17e50 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
17e60 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
17e70 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
17e80 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
17e90 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
17ea0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
17eb0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
17ec0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
17ed0 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
17ee0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
17ef0 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
17f00 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
17f30 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
17f40 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
17f70 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
17f80 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
17f90 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
17fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
17fb0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
17fc0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
17fd0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
17fe0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
17ff0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
18000 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
18010 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
18020 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
18030 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f  TE_DEBUG.  /* Co
18040 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70  nfirm that aiMap
18050 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63  [] contains nVec
18060 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75  tor integer valu
18070 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
18080 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e  .  ** nVector-1.
18090 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
180a0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
180b0 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a      int j, cnt;.
180c0 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b      for(cnt=j=0;
180d0 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29   j<nVector; j++)
180e0 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69   if( aiMap[j]==i
180f0 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73   ) cnt++;.    as
18100 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a  sert( cnt==1 );.
18110 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18120 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
18130 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
18140 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
18150 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  . If the LHS is 
18160 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20  a .  ** vector, 
18170 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65  then it is store
18180 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  d in an array of
18190 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65   nVector registe
181a0 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a  rs starting .  *
181b0 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20  * at r1..  **.  
181c0 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  ** sqlite3FindIn
181d0 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61  Index() might ha
181e0 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65  ve reordered the
181f0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c   fields of the L
18200 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73  HS vector.  ** s
18210 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64  o that the field
18220 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d  s are in the sam
18230 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78  e order as an ex
18240 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20  isting index.   
18250 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d  The.  ** aiMap[]
18260 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
18270 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  a mapping from t
18280 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20  he original LHS 
18290 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20  field order to. 
182a0 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72   ** the field or
182b0 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73  der that matches
182c0 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a   the RHS index..
182d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
182e0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
182f0 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20  se);.  rLhsOrig 
18300 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  = exprCodeVector
18310 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
18320 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28  &iDummy);.  for(
18330 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26  i=0; i<nVector &
18340 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69  & aiMap[i]==i; i
18350 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53  ++){} /* Are LHS
18360 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65   fields reordere
18370 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e  d? */.  if( i==n
18380 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a  Vector ){.    /*
18390 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20   LHS fields are 
183a0 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f  not reordered */
183b0 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73  .    rLhs = rLhs
183c0 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Orig;.  }else{. 
183d0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
183e0 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69  order the LHS fi
183f0 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74  elds according t
18400 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72  o aiMap */.    r
18410 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Lhs = sqlite3Get
18420 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
18430 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
18440 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18450 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
18460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18470 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c  3(v, OP_Copy, rL
18480 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61  hsOrig+i, rLhs+a
18490 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  iMap[i], 0);.   
184a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
184b0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
184c0 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
184d0 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
184e0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
184f0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
18500 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
18510 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
18520 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
18530 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
18540 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
18550 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
18560 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65   step (1) in the
18570 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
18580 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69  optimized algori
18590 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  thm..  */.  if( 
185a0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
185b0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
185c0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
185d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
185e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
185f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18600 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
18610 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
18620 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
18630 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18640 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
18650 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
18660 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
18670 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
18680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
18690 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
186a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
186b0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
186c0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
186d0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
186e0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
186f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18700 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
18710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18720 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68  , OP_BitAnd, rLh
18730 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75  s, rLhs, regCkNu
18740 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ll);.    }.    f
18750 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73  or(ii=0; ii<pLis
18760 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  t->nExpr; ii++){
18770 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
18780 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18790 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
187a0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67  [ii].pExpr, &reg
187b0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69  ToFree);.      i
187c0 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20  f( regCkNull && 
187d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
187e0 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69  Null(pList->a[ii
187f0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
18800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18810 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
18820 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72  nd, regCkNull, r
18830 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  2, regCkNull);. 
18840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18850 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
18860 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c  -1 || destIfNull
18870 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
18880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18890 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
188a0 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c  _Eq, rLhs, label
188b0 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  Ok, r2,.        
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
188e0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
188f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18900 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d  eIf(v, ii<pList-
18910 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
18920 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
18930 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e  f(v, ii==pList->
18940 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
18950 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18960 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
18970 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18990 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
189a0 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20  IfFalse );.     
189b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
189c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
189d0 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Lhs, destIfFalse
189e0 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
18a10 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43  _COLLSEQ); VdbeC
18a20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18a40 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
18a50 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  0] | SQLITE_JUMP
18a60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
18a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
18a80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18a90 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
18aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18ab0 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
18ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ad0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
18ae0 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
18af0 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
18b00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18b10 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
18b20 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
18b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
18b40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18b50 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b  bel(v, labelOk);
18b60 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
18b70 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18b80 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  e, regCkNull);. 
18b90 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
18ba0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
18bb0 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  ed;.  }..  /* St
18bc0 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73  ep 2: Check to s
18bd0 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f  ee if the LHS co
18be0 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
18bf0 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65  columns.  If the
18c00 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63  .  ** LHS does c
18c10 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65  ontain NULLs the
18c20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
18c30 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53  t be either FALS
18c40 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20  E or NULL..  ** 
18c50 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69  We will then ski
18c60 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  p the binary sea
18c70 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a  rch of the RHS..
18c80 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
18c90 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
18ca0 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74  se ){.    destSt
18cb0 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ep2 = destIfFals
18cc0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
18cd0 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
18ce0 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56  Step6 = sqlite3V
18cf0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18d00 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18d10 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
18d20 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
18d30 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
18d40 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e  dSubexpr(pExpr->
18d50 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69  pLeft, i);.    i
18d60 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
18d70 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20  nBeNull(p) ){.  
18d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18d90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
18da0 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  ll, rLhs+i, dest
18db0 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64  Step2);.      Vd
18dc0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18dd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
18de0 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20  tep 3.  The LHS 
18df0 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20  is now known to 
18e00 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f  be non-NULL.  Do
18e10 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
18e20 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ch.  ** of the R
18e30 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53  HS using the LHS
18e40 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66   as a probe.  If
18e50 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75   found, the resu
18e60 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e  lt is.  ** true.
18e70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
18e80 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
18e90 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
18ea0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
18eb0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
18ec0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61  f table b-tree a
18ed0 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20  nd so we also.  
18ee0 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74    ** know that t
18ef0 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55  he RHS is non-NU
18f00 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63  LL.  Hence, we c
18f10 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61  ombine steps 3 a
18f20 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  nd 4.    ** into
18f30 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
18f40 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
18f50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18f60 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70  _SeekRowid, pExp
18f70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
18f80 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20  fFalse, rLhs);. 
18f90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18fa0 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74  v);.    addrTrut
18fb0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
18fc0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
18fd0 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20  to);  /* Return 
18fe0 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  True */.  }else{
18ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19000 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
19010 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65  inity, rLhs, nVe
19020 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e  ctor, 0, zAff, n
19030 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  Vector);.    if(
19040 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
19050 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  stIfNull ){.    
19060 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65    /* Combine Ste
19070 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69  p 3 and Step 5 i
19080 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
19090 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ode */.      sql
190a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
190b0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
190c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
190d0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20   destIfFalse,.  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
19100 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
19110 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19120 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
19130 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
19140 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72  .    }.    /* Or
19150 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66  dinary Step 3, f
19160 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
19170 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c  e FALSE and NULL
19180 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
19190 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
191a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
191b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
191c0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
191d0 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  le, 0,.         
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
19200 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
19210 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19220 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20  }..  /* Step 4. 
19230 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b   If the RHS is k
19240 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
19250 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e  ULL and we did n
19260 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20  ot find.  ** an 
19270 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61  match on the sea
19280 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  rch above, then 
19290 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
192a0 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20  be FALSE..  */. 
192b0 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
192c0 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29   && nVector==1 )
192d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
192e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
192f0 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
19300 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  ll, destIfFalse)
19310 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19320 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
19330 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20   Step 5.  If we 
19340 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
19350 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  t the difference
19360 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e   between NULL an
19370 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68  d.  ** FALSE, th
19380 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66  en just return f
19390 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  alse. .  */.  if
193a0 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
193b0 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69  estIfNull ) sqli
193c0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
193d0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20  estIfFalse);..  
193e0 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20  /* Step 6: Loop 
193f0 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20  through rows of 
19400 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72  the RHS.  Compar
19410 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68  e each row to th
19420 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61  e LHS..  ** If a
19430 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ny comparison is
19440 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
19450 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  result is NULL. 
19460 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d   If all.  ** com
19470 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c  parisons are FAL
19480 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61  SE then the fina
19490 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53  l result is FALS
194a0 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  E..  **.  ** For
194b0 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69   a scalar LHS, i
194c0 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
194d0 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68  to check just th
194e0 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a  e first row.  **
194f0 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
19500 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70  /.  if( destStep
19510 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52  6 ) sqlite3VdbeR
19520 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19530 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64  estStep6);.  add
19540 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
19550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
19560 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
19570 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
19580 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
19590 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65  ge(v);.  if( nVe
195a0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65  ctor>1 ){.    de
195b0 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69  stNotNull = sqli
195c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
195d0 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
195e0 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72    /* For nVector
195f0 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65  ==1, combine ste
19600 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d  ps 6 and 7 by im
19610 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
19620 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45  ing.    ** FALSE
19630 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   if the first co
19640 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
19650 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74  NULL */.    dest
19660 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66  NotNull = destIf
19670 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72  False;.  }.  for
19680 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
19690 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
196a0 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  *p;.    CollSeq 
196b0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
196c0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
196d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
196e0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
196f0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
19700 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
19710 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
19720 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
19730 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  se, p);.    sqli
19740 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19750 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
19760 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33  r->iTable, i, r3
19770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19780 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
19790 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
197a0 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
197d0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
197e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
197f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
19800 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19810 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
19820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19830 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19840 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
19850 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
19860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19870 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19880 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
19890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
198a0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
198b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
198c0 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64  drTop+1);.    Vd
198d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
198e0 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20      /* Step 7:  
198f0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
19900 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
19910 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
19920 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66  must.    ** be f
19930 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  alse. */.    sql
19940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19950 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
19960 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a  stIfFalse);.  }.
19970 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65  .  /* Jumps here
19980 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74   in order to ret
19990 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73  urn true. */.  s
199a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
199b0 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f  re(v, addrTruthO
199c0 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72  p);..sqlite3Expr
199d0 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a  CodeIN_finished:
199e0 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68  .  if( rLhs!=rLh
199f0 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52  sOrig ) sqlite3R
19a00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19a10 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73  arse, rLhs);.  s
19a20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19a30 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64  op(pParse);.  Vd
19a40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
19a50 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73  nd IN expr"));.s
19a60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19a70 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71  _oom_error:.  sq
19a80 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
19a90 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
19aa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19ab0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
19ac0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
19ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19ae0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
19af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
19b00 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
19b10 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
19b20 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
19b30 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
19b40 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
19b50 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
19b60 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
19b70 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
19b80 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
19b90 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
19ba0 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
19bb0 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
19bc0 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
19bd0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
19be0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
19bf0 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
19c00 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
19c10 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
19c20 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
19c30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
19c40 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
19c50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
19c60 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
19c70 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
19c80 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
19c90 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
19ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
19cb0 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
19cc0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
19cd0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
19ce0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
19cf0 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
19d00 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
19d10 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
19d20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
19d30 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
19d40 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
19d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d60 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c  4Dup8(v, OP_Real
19d70 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
19d80 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45  8*)&value, P4_RE
19d90 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
19da0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
19db0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
19dc0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
19dd0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
19de0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
19df0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
19e00 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
19e10 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
19e20 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
19e30 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
19e40 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
19e50 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
19e60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19e70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
19e80 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
19e90 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
19ea0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19eb0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
19ec0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
19ed0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
19ee0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
19ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
19f00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
19f10 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
19f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
19f40 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
19f50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
19f60 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
19f70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19f80 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
19f90 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
19fa0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
19fb0 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  = sqlite3DecOrHe
19fc0 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65  xToI64(z, &value
19fd0 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 31 20  );.    if( c==1 
19fe0 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21 6e 65 67  || (c==2 && !neg
19ff0 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c 61  Flag) || (negFla
1a000 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c  g && value==SMAL
1a010 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69  LEST_INT64)){.#i
1a020 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1a030 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1a040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1a050 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
1a060 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
1a070 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1a080 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
1a090 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53  .#else.#ifndef S
1a0a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
1a0b0 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28  NTEGER.      if(
1a0c0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1a0d0 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29  p(z,"0x",2)==0 )
1a0e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a0f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a100 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74  , "hex literal t
1a110 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e  oo big: %s%s", n
1a120 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29  egFlag?"-":"",z)
1a130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
1a140 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
1a150 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1a160 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
1a170 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  m);.      }.#end
1a180 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1a190 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1a1a0 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
1a1b0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
1a1c0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
1a1d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a1e0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
1a1f0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
1a200 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1a210 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a  4_INT64);.    }.
1a220 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61    }.}../*.** Era
1a230 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20  se column-cache 
1a240 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a  entry number i.*
1a250 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
1a260 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
1a270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1a280 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73   i){.  if( pPars
1a290 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1a2a0 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
1a2b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
1a2c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1a2d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
1a2e0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1a2f0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1a300 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1a310 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a320 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d  e[i].iReg;.    }
1a330 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1a340 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66  ColCache--;.  if
1a350 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1a360 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61  Cache ){.    pPa
1a370 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1a380 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1a390 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1a3a0 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a  olCache];.  }.}.
1a3b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
1a3c0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
1a3d0 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
1a3e0 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
1a3f0 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
1a400 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
1a410 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
1a420 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
1a430 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1a440 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
1a450 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
1a460 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
1a470 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
1a480 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
1a490 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
1a4a0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1a4b0 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  p;..  /* Unless 
1a4c0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a4d0 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72 20  urred, register 
1a4e0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
1a4f0 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a  ys positive. */.
1a500 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
1a510 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a520 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a530 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a540 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
1a550 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
1a560 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
1a570 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
1a580 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
1a590 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
1a5a0 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
1a5b0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
1a5c0 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
1a5d0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
1a5e0 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
1a5f0 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
1a600 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
1a610 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
1a620 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
1a630 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
1a640 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1a650 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
1a660 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
1a670 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20  _ColumnCache) ) 
1a680 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
1a690 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
1a6a0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
1a6b0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
1a6c0 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
1a6d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
1a6e0 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
1a6f0 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
1a700 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
1a710 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
1a720 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
1a730 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
1a740 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
1a750 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
1a760 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
1a770 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a780 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1a790 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1a7a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a7b0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
1a7c0 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
1a7d0 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
1a7e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
1a7f0 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20 66  che is already f
1a800 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ull, delete the 
1a810 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75  least recently u
1a820 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  sed entry */.  i
1a830 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  f( pParse->nColC
1a840 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43  ache>=SQLITE_N_C
1a850 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d  OLCACHE ){.    m
1a860 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66  inLru = 0x7fffff
1a870 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d  ff;.    idxLru =
1a880 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   -1;.    for(i=0
1a890 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1a8a0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1a8b0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1a8c0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1a8d0 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
1a8e0 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72 75  {.        idxLru
1a8f0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69   = i;.        mi
1a900 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
1a910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a920 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
1a930 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
1a940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1a950 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
1a960 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f  ache[pParse->nCo
1a970 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a  lCache++];.  }..
1a980 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1a990 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e   entry to the en
1a9a0 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a  d of the cache *
1a9b0 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20  /.  p->iLevel = 
1a9c0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a9d0 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  vel;.  p->iTable
1a9e0 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43   = iTab;.  p->iC
1a9f0 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
1aa00 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
1aa10 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1aa20 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61  ;.  p->lru = pPa
1aa30 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1aa40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
1aa50 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
1aa60 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
1aa70 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
1aa80 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
1aa90 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
1aaa0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
1aab0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
1aac0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
1aad0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1aae0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
1aaf0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1ab00 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
1ab10 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
1ab20 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  le( i<pParse->nC
1ab30 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73  olCache ){.    s
1ab40 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1ab50 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43  *p = &pParse->aC
1ab60 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
1ab70 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69  if( p->iReg >= i
1ab80 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c  Reg && p->iReg <
1ab90 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20   iReg+nReg ){.  
1aba0 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
1abb0 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ear(pParse, i);.
1abc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1abd0 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
1abe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
1abf0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
1ac00 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
1ac10 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
1ac20 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
1ac30 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
1ac40 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
1ac50 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
1ac60 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
1ac70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
1ac80 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
1ac90 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1aca0 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
1acb0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
1acc0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
1acd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1ace0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1acf0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1ad00 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1ad10 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1ad20 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
1ad30 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
1ad40 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
1ad50 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
1ad60 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
1ad70 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
1ad80 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
1ad90 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
1ada0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
1adb0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1adc0 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
1add0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ade0 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
1adf0 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
1ae00 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
1ae10 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
1ae20 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
1ae30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ae40 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
1ae50 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  e){.  int i = 0;
1ae60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1ae70 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
1ae80 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  1 );.  pParse->i
1ae90 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69  CacheLevel--;.#i
1aea0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1aeb0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1aec0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1aed0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1aee0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1aef0 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
1af00 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1af10 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1af20 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72  .  while( i<pPar
1af30 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1af40 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1af50 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c  >aColCache[i].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 69 29 3b 0a 20 20  r(pParse, i);.  
1afa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1afb0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1afc0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
1afd0 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
1afe0 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
1aff0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
1b000 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
1b010 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
1b020 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
1b030 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
1b040 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
1b050 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
1b060 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
1b070 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
1b080 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
1b090 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
1b0a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1b0b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1b0c0 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
1b0d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1b0e0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1b0f0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1b100 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1b110 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1b120 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1b130 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1b140 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1b150 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
1b160 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1b170 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1b180 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1b190 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1b1a0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1b1b0 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1b1c0 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1b1d0 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1b1e0 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1b1f0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1b200 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b210 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1b220 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1b230 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1b240 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b250 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1b260 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1b270 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1b280 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1b290 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1b2a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1b2b0 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1b2c0 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1b2d0 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1b2e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1b2f0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1b300 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1b310 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1b320 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1b330 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1b340 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1b350 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1b360 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1b370 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1b380 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1b390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1b3a0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1b3b0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1b3c0 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1b3d0 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1b3e0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1b3f0 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20   = iTabCur;.    
1b400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1b410 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
1b420 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
1b430 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
1b440 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
1b450 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b460 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1b470 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ble(pParse->pVdb
1b480 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  e, pIdx->pTable,
1b490 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20   iTabCur,.      
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
1b4c0 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a  abCol, regOut);.
1b4d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1b4e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
1b4f0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1b500 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
1b510 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
1b520 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b530 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1b540 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
1b550 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
1b560 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
1b570 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b580 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1b590 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
1b5a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1b5b0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
1b5c0 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Cur,    /* The t
1b5d0 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72  able cursor.  Or
1b5e0 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66   the PK cursor f
1b5f0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1b600 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
1b610 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1b620 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
1b630 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
1b640 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1b650 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1b660 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  e into this regi
1b670 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
1b680 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1b690 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1b6a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b6b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1b6c0 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1b6d0 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1b6e0 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1b6f0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1b700 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1b710 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1b720 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1b730 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1b740 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1b750 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1b760 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1b770 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1b780 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1b790 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1b7a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b7b0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1b7c0 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1b7d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1b7e0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1b7f0 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1b800 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1b810 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1b820 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1b830 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1b840 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1b850 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1b860 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1b870 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1b880 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1b890 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1b8a0 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1b8b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1b8c0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1b8d0 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1b8e0 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1b8f0 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1b900 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1b910 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1b920 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1b930 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1b940 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1b950 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1b960 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1b970 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1b980 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1b990 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1b9a0 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1b9b0 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1b9c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1b9d0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1b9e0 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1b9f0 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1ba00 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1ba10 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1ba20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ba30 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1ba40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1ba50 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ba60 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ba70 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1ba80 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1ba90 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1baa0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1bab0 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1bac0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1bad0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1bae0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1baf0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1bb00 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1bb10 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1bb20 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1bb30 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1bb40 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1bb50 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1bb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1bb70 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1bb80 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1bb90 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1bba0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1bbb0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1bbc0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1bbd0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1bbe0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1bbf0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1bc00 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1bc10 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1bc20 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1bc30 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1bc40 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1bc50 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1bc60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1bc70 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1bc80 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1bc90 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
1bca0 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
1bcb0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
1bcc0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1bcd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1bce0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1bcf0 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1bd00 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1bd10 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1bd20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1bd30 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1bd40 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
1bd50 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1bd60 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
1bd70 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1bd80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1bd90 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  iReg;.}.void sql
1bda0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1bdb0 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61  olumnToReg(.  Pa
1bdc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1bdd0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1bde0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1bdf0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1be00 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1be10 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1be20 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1be30 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1be40 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1be50 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1be60 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1be70 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1be80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1be90 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1bea0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1beb0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
1bec0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1bed0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1bee0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1bef0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1bf00 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
1bf10 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52  lumn, iTable, iR
1bf20 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31  eg, 0);.  if( r1
1bf30 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33  !=iReg ) sqlite3
1bf40 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1bf50 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1bf60 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d  py, r1, iReg);.}
1bf70 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
1bf80 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
1bf90 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
1bfa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bfb0 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
1bfc0 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
1bfd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1bfe0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1bff0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1c000 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1c010 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1c020 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1c030 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1c040 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
1c050 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
1c060 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1c070 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1c080 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61  pReg.     && pPa
1c090 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1c0a0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1c0b0 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b  aTempReg).    ){
1c0c0 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  .       pParse->
1c0d0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1c0e0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1c0f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1c100 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1c110 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1c120 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a  olCache = 0;.}..
1c130 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
1c140 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
1c150 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
1c160 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
1c170 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
1c180 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
1c190 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
1c1a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c1b0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
1c1c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c1d0 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
1c1e0 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
1c1f0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1c200 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
1c210 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
1c220 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c230 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1c240 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1c250 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1c260 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1c270 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
1c280 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
1c290 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
1c2a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c2b0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1c2c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c2d0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1c2e0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1c2f0 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1c300 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1c310 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1c320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c330 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1c340 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1c350 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
1c360 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1c370 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
1c380 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
1c390 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c3a0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1c3b0 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1c3c0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1c3d0 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
1c3e0 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1c3f0 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
1c400 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
1c410 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
1c420 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
1c430 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
1c440 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1c450 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1c460 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
1c470 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
1c480 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
1c490 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
1c4a0 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
1c4b0 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
1c4c0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1c4d0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1c4e0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
1c4f0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1c500 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1c510 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1c520 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1c530 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c540 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
1c550 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
1c560 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
1c570 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
1c580 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
1c590 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
1c5a0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1c5b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
1c5c0 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
1c5d0 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
1c5e0 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1c5f0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1c600 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1c610 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1c620 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1c630 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1c640 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1c650 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1c660 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1c670 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1c680 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1c690 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1c6a0 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1c6b0 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1c6c0 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1c6d0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1c6e0 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1c6f0 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1c700 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1c710 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1c720 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1c730 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1c740 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1c750 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1c760 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1c770 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1c780 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1c790 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1c7a0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1c7b0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1c7c0 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1c7d0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1c7e0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1c7f0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1c800 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1c810 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1c820 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1c830 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1c840 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1c850 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1c860 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1c870 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1c880 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1c890 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1c8a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1c8b0 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1c8c0 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1c8d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1c8e0 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1c8f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c900 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1c910 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1c920 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1c930 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1c940 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1c950 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1c960 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1c970 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c980 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1c990 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1c9a0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1c9b0 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1c9c0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1c9d0 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 52 65  ECT ){.      iRe
1c9e0 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  sult = sqlite3Co
1c9f0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
1ca00 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20  se, p, 0, 0);.  
1ca10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1ca20 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73  nt i;.      iRes
1ca30 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ult = pParse->nM
1ca40 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72  em+1;.      pPar
1ca50 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
1ca60 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ult;.      for(i
1ca70 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69  =0; i<nResult; i
1ca80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
1ca90 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1caa0 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  orable(pParse, p
1cab0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1cac0 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74  pExpr, i+iResult
1cad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1cae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1caf0 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
1cb00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
1cb10 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
1cb20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
1cb30 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
1cb40 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
1cb50 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
1cb60 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1cb70 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
1cb80 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
1cb90 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
1cba0 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
1cbb0 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
1cbc0 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
1cbd0 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
1cbe0 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
1cbf0 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
1cc00 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1cc10 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
1cc20 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
1cc30 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
1cc40 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
1cc50 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
1cc60 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1cc70 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
1cc80 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
1cc90 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
1cca0 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
1ccb0 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
1ccc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1ccd0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
1cce0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1ccf0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1cd00 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
1cd10 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1cd20 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
1cd30 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1cd40 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd60 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
1cd70 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
1cd80 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
1cd90 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
1cda0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
1cdb0 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
1cdc0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1cdd0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1cde0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1cdf0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1ce00 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1ce10 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
1ce20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1ce30 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1ce40 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1ce50 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
1ce60 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
1ce70 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
1ce80 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
1ce90 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20    Expr tempX;   
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ceb0 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73  emporary express
1cec0 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  ion node */.  in
1ced0 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73  t p5 = 0;..  ass
1cee0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
1cef0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
1cf00 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76  >nMem );.  if( v
1cf10 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1cf20 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
1cf30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1cf40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1cf50 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
1cf60 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
1cf70 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
1cf80 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
1cf90 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
1cfa0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1cfb0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
1cfc0 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1cfd0 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
1cfe0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
1cff0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d000 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
1d010 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
1d020 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
1d030 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
1d040 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
1d050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1d060 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
1d070 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f        return pCo
1d080 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  l->iMem;.      }
1d090 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
1d0a0 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
1d0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d0c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1d0d0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
1d0e0 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
1d0f0 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  PTab,.          
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1d120 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  rColumn, target)
1d130 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d140 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1d150 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
1d160 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
1d170 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
1d180 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
1d190 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1d1a0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
1d1b0 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54  iTab = pExpr->iT
1d1c0 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20  able;.      if( 
1d1d0 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
1d1e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b    if( pParse->ck
1d1f0 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Base>0 ){.      
1d200 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
1d210 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
1d220 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
1d230 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
1d240 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
1d250 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1d260 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d  Column + pParse-
1d270 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20  >ckBase;.       
1d280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d290 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65    /* Coding an e
1d2a0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1d2b0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64  s part of an ind
1d2c0 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20  ex where column 
1d2d0 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20  names.          
1d2e0 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ** in the index 
1d2f0 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62  refer to the tab
1d300 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  le to which the 
1d310 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f  index belongs */
1d320 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20  .          iTab 
1d330 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  = pParse->iSelfT
1d340 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ab;.        }.  
1d350 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1d360 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1d370 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1d380 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
1d390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1d3c0 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1d3f0 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a  pr->op2);.    }.
1d400 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1d410 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
1d420 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1d430 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
1d440 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1d450 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1d460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d470 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1d480 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1d490 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1d4a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1d4b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d4c0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1d4d0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1d4e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1d4f0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1d500 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1d510 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1d520 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1d530 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1d540 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1d550 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1d560 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1d570 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1d580 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1d590 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d5a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d5b0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1d5c0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1d5d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1d5e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d5f0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1d600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1d610 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1d620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d630 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1d640 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1d650 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1d660 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1d670 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1d680 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1d690 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1d6a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d6b0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1d6c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d6d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1d6e0 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1d6f0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1d700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d710 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1d720 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1d730 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1d740 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1d750 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1d760 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1d770 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1d780 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1d790 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1d7a0 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1d7b0 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1d7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d7d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1d7e0 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1d7f0 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1d800 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1d810 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1d820 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1d830 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1d840 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d850 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d860 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1d870 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1d880 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1d890 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1d8a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1d8b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1d8c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d8d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d8e0 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1d8f0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1d900 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1d910 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1d920 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1d930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1d940 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1d950 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1d960 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1d970 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1d980 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1d990 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1d9a0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1d9b0 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1d9c0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1d9d0 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1d9e0 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1d9f0 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1da00 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1da10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1da20 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1da30 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1da40 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1da50 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1da60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1da70 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1da80 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1da90 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1daa0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1dab0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1dac0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1dad0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1dae0 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1daf0 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1db00 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1db10 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1db20 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1db30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1db40 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1db50 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1db60 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1db70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1db80 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1db90 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1dba0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1dbb0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1dbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1dbd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1dbe0 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1dc10 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1dc20 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1dc30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
1dc40 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1dc50 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
1dc60 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
1dc70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1dc80 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1dc90 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
1dca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e  .      return in
1dcb0 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Reg;.    }.#endi
1dcc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1dcd0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1dce0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1dcf0 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1dd00 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1dd10 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1dd20 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1dd30 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1dd40 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1dd50 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1dd60 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1dd70 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1dd80 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1dd90 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1dda0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1ddb0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1ddc0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1ddd0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1dde0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1ddf0 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1de00 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1de10 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1de20 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1de30 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1de40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1de50 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1de60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1de70 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1de80 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1de90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dea0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1deb0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1dec0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1ded0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1dee0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1def0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1df00 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1df10 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1df20 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1df30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1df40 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1df50 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1df60 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1df70 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1df80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1df90 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1dfa0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1dfb0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1dfc0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1dfd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1dfe0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1dff0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1e000 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1e010 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1e020 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e030 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1e040 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1e050 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e060 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1e070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e080 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1e090 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1e0a0 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1e0b0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1e0c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e0d0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1e0e0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1e0f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e100 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1e110 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e120 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e130 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e140 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e160 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e170 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1e180 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1e190 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1e1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1e1b0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1e1c0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1e1d0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1e1e0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1e1f0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1e200 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1e210 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1e220 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1e230 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1e240 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1e250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e260 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1e270 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e280 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1e290 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e2a0 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1e2c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1e2d0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1e2e0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1e2f0 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1e300 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e310 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1e320 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1e330 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1e340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e350 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1e360 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1e370 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1e380 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e390 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1e3a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e3b0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1e3c0 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1e3d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1e3e0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1e3f0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1e400 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1e410 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e420 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1e430 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1e440 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1e450 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e460 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1e470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e480 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1e490 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1e4a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1e4b0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1e4c0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1e4d0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1e4e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e4f0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1e500 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1e510 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1e520 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1e530 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1e540 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e560 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e570 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e580 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1e590 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e5a0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e5b0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e5c0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1e5d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e5e0 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1e5f0 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1e600 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e610 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1e620 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e630 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e640 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e650 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1e660 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1e670 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1e680 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1e690 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1e6a0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1e6b0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1e6c0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1e6d0 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1e6e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e6f0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1e700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e710 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e720 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
1e730 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1e740 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
1e750 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e760 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e770 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1e780 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1e790 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
1e7a0 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
1e7b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e7c0 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a   target;.#endif.
1e7d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e7e0 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1e7f0 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1e800 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1e810 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1e820 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1e830 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1e840 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1e850 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e860 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e870 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1e880 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1e890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e8a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e8b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e8c0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1e8d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e8e0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1e8f0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1e900 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1e910 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e920 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1e930 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e940 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1e950 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
1e960 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
1e970 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
1e980 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65  P_BitNot );   te
1e990 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1e9a0 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61  ITNOT );.      a
1e9b0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
1e9c0 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20  P_Not );        
1e9d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e9e0 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
1e9f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ea00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ea10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1ea20 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1ea30 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ea40 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  e1==0 );.      s
1ea50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ea60 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
1ea70 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1ea80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ea90 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1eaa0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1eab0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1eac0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ead0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1eae0 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1eaf0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1eb00 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1eb10 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1eb20 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1eb30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1eb40 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1eb50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1eb60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1eb70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1eb80 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1eb90 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1eba0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ebb0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1ebc0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ebd0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1ebe0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1ebf0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1ec00 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1ec10 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1ec20 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1ec30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ec40 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1ec50 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1ec60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ec70 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1ec80 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ec90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1eca0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1ecb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ecc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1ecd0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1ece0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1ecf0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1ed00 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1ed10 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1ed20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ed30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ed40 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1ed50 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1ed60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ed70 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1ed80 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1ed90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eda0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1edb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1edc0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
1edd0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
1ede0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1edf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ee00 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1ee10 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1ee20 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1ee30 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1ee40 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1ee50 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee70 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
1ee80 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1ee90 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1eea0 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
1eeb0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
1eec0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
1eed0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1eee0 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
1eef0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
1ef00 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
1ef10 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
1ef20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
1ef30 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1ef40 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
1ef50 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
1ef60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1ef70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1ef80 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
1ef90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1efa0 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
1efb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1efc0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
1efd0 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
1efe0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1eff0 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
1f000 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1f010 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1f020 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
1f030 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
1f040 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
1f050 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
1f060 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c  k(pParse) && sql
1f070 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1f080 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
1f090 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
1f0a0 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
1f0b0 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53   be expensive. S
1f0c0 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f  o try to move co
1f0d0 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73  nstant functions
1f0e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20  .        ** out 
1f0f0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
1f100 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  p, even if that 
1f110 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f  means an extra O
1f120 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20  P_Copy. */.     
1f130 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1f140 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1f150 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d  pParse, pExpr, -
1f160 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1f170 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f180 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1f190 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1f1a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
1f1b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f1c0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1f1d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
1f1e0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
1f1f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
1f200 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
1f210 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1f220 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
1f230 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
1f240 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
1f250 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1f260 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1f270 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f280 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
1f290 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44  zToken;.      pD
1f2a0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
1f2b0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
1f2c0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
1f2d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1f2e0 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53  ENABLE_UNKNOWN_S
1f2f0 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  QL_FUNCTION.    
1f300 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26    if( pDef==0 &&
1f310 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
1f320 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
1f330 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1f340 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e  nction(db, "unkn
1f350 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63  own", nFarg, enc
1f360 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
1f370 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
1f380 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e  Def==0 || pDef->
1f390 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
1f3a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f3b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1f3c0 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
1f3d0 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a  n: %s()", zId);.
1f3e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f3f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1f400 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
1f410 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
1f420 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
1f430 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
1f440 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
1f450 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
1f460 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
1f470 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
1f480 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
1f490 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
1f4a0 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
1f4b0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
1f4c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
1f4d0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1f4e0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
1f4f0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
1f500 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
1f510 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1f520 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1f530 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
1f540 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
1f550 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1f560 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
1f570 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1f580 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
1f590 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
1f5a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1f5b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f5c0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
1f5d0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
1f5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
1f5f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1f600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f610 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1f620 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
1f630 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1f640 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1f650 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f660 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f670 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
1f680 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
1f690 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1f6a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f6b0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1f6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f6d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1f6e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
1f6f0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
1f700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1f710 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
1f720 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
1f730 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
1f740 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
1f750 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
1f760 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
1f770 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
1f780 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
1f790 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
1f7a0 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
1f7b0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
1f7c0 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
1f7d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f7e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f7f0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
1f800 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
1f810 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f820 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f830 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
1f840 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
1f850 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
1f860 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
1f870 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
1f880 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
1f890 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
1f8a0 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
1f8b0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
1f8c0 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
1f8d0 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
1f8e0 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
1f8f0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1f900 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1f910 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
1f920 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1f930 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
1f940 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
1f950 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
1f960 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
1f970 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
1f980 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
1f990 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
1f9a0 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
1f9b0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1f9c0 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
1f9d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
1f9e0 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
1f9f0 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
1fa00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1fa20 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53  ff ? azAff[aff-S
1fa30 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20  QLITE_AFF_BLOB] 
1fa40 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20  : "none");.     
1fa50 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1fa60 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1fa70 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
1fa80 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
1fa90 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
1faa0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1fab0 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
1fac0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
1fad0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1fae0 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
1faf0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
1fb00 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
1fb10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fb20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
1fb30 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1fb40 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
1fb50 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
1fb60 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
1fb70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fb80 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
1fb90 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
1fba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fbb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
1fbc0 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
1fbd0 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
1fbe0 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
1fbf0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1fc00 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
1fc10 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
1fc20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fc30 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
1fc40 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1fc50 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
1fc60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1fc70 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
1fc80 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
1fc90 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
1fca0 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
1fcb0 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
1fcc0 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
1fcd0 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
1fce0 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
1fcf0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
1fd00 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
1fd10 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
1fd20 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
1fd30 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
1fd40 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
1fd50 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
1fd60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1fd70 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1fd80 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
1fd90 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
1fda0 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
1fdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
1fdc0 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
1fdd0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1fde0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
1fdf0 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
1fe00 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
1fe10 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
1fe20 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
1fe30 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
1fe40 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
1fe50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
1fe60 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
1fe70 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1fe80 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1fe90 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
1fea0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
1feb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
1fec0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
1fed0 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
1fee0 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
1fef0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1ff00 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
1ff10 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
1ff20 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
1ff30 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
1ff40 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
1ff50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ff60 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
1ff70 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
1ff80 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
1ff90 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
1ffa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ffb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ffc0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1ffd0 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
1ffe0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
1fff0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
20000 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
20010 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
20020 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20  rg, r1, 0,.     
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20050 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
20060 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
20070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20080 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
20090 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
200a0 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
200b0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
200c0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
200d0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
200e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
200f0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
20100 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
20110 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
20120 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
20130 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
20140 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
20150 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
20160 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
20170 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
20180 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
20190 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
201a0 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
201b0 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
201c0 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
201d0 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
201e0 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
201f0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
20200 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
20210 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
20220 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
20230 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
20240 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
20250 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
20260 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
20270 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
20280 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
20290 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
202a0 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
202b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
202c0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
202d0 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
202e0 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
202f0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
20300 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
20310 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
20320 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
20330 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
20340 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
20350 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
20360 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
20370 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
20380 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
20390 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
203a0 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
203b0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
203c0 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
203d0 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
203e0 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
203f0 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
20400 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
20410 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
20420 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
20430 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
20440 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
20450 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
20460 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
20470 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
20480 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
20490 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
204a0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
204b0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
204c0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
204d0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
204e0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
204f0 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
20500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20510 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
20520 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
20530 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
20540 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
20550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20560 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
20570 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  on0, constMask, 
20580 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
205b0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
205c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
205d0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
205e0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
205f0 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d   nFarg && constM
20600 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask==0 ){.      
20610 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
20620 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
20630 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
20640 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
20650 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
20660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20670 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20680 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
20690 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
206a0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LECT: {.      in
206b0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  t nCol;.      te
206c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
206d0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
206e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
206f0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
20700 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
20710 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78  T && (nCol = pEx
20720 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
20730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31  EList->nExpr)!=1
20740 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20750 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
20760 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20  r(pParse, nCol, 
20770 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
20780 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20790 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
207a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
207b0 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
207c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
207d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
207e0 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a  K_SELECT_COLUMN:
207f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
20800 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20810 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
20820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
20830 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
20840 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
20850 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
20860 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
20870 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
20880 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
20890 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
208a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
208b0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
208c0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
208d0 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26  iTable.       &&
208e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
208f0 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  (n = sqlite3Expr
20900 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
20910 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20  ->pLeft)) .     
20920 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20930 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20940 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20  se, "%d columns 
20950 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75  assigned %d valu
20960 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  es",.           
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
20990 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  le, n);.      }.
209a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
209b0 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
209c0 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  e + pExpr->iColu
209d0 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  mn;.    }.    ca
209e0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
209f0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
20a00 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
20a10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20a20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
20a30 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
20a40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20a60 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
20a70 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
20a80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20a90 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
20aa0 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
20ab0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20ac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20ad0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20ae0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
20af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20b00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20b10 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
20b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20b30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
20b40 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
20b50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20b70 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
20b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20b90 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
20ba0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
20bb0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20  _SUBQUERY */... 
20bc0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
20bd0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
20be0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
20bf0 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
20c00 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
20c10 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
20c20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
20c30 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
20c40 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
20c50 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
20c60 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
20c70 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
20c80 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
20c90 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
20ca0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
20cb0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20cc0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
20cd0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
20ce0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
20cf0 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29  r, target, 0, 0)
20d00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
20d10 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
20d20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20   case TK_SPAN:. 
20d30 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41     case TK_COLLA
20d40 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  TE: .    case TK
20d50 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
20d60 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
20d70 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
20d80 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20d90 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
20da0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
20db0 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
20dc0 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
20dd0 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
20de0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
20df0 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
20e00 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
20e10 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
20e20 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
20e30 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
20e40 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
20e50 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
20e60 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
20e70 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
20e80 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
20e90 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
20ea0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
20eb0 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
20ec0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
20ed0 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
20ee0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
20ef0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
20f00 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
20f10 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
20f20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
20f30 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
20f40 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
20f50 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
20f60 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
20f70 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
20f80 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
20f90 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
20fa0 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
20fb0 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
20fc0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
20fd0 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
20fe0 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
20ff0 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
21000 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
21010 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
21020 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
21030 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
21040 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
21050 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
21060 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
21070 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
21080 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
21090 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
210a0 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
210b0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
210c0 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
210d0 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
210e0 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
210f0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
21100 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
21110 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
21120 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
21130 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
21140 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
21150 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
21160 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
21170 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
21180 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
21190 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
211a0 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
211b0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
211c0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
211d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
211e0 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
211f0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
21200 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
21210 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
21220 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
21230 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
21240 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
21250 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
21260 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
21270 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
21280 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
21290 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
212a0 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
212b0 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
212c0 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
212d0 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
212e0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
212f0 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
21300 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
21310 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
21320 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
21330 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
21340 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
21350 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
21360 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
21370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
21380 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
21390 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
213a0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
213b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
213c0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
213d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
213e0 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
213f0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
21400 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
21410 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
21420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21430 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
21440 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
21450 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21460 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
21470 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
21480 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
21490 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
214a0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
214b0 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
214c0 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
214d0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
214e0 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
214f0 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
21500 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
21510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
21520 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
21530 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
21540 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
21550 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
21560 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
21570 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
21580 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
21590 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
215a0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
215b0 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
215c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
215d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
215e0 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
215f0 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
21600 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
21610 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
21620 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
21630 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
21640 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
21650 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21660 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
21670 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
21680 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
21690 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
216a0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
216b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
216c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
216d0 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
216e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
216f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21700 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21710 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
21720 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
21730 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21740 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
21750 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72  used");.      br
21760 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21770 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
21780 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
21790 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
217a0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
217b0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
217c0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
217d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
217e0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
217f0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
21800 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
21810 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
21820 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
21830 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
21840 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
21850 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
21860 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
21870 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
21880 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
21890 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
218a0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
218b0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
218c0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
218d0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
218e0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
218f0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
21900 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
21910 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
21920 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
21930 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
21940 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
21950 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
21960 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
21970 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
21980 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
21990 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
219a0 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
219b0 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
219c0 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
219d0 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
219e0 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
219f0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
21a00 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
21a10 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
21a20 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
21a30 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
21a40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21a50 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
21a60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
21a70 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
21a80 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
21a90 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
21aa0 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
21ab0 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
21ac0 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
21ad0 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
21ae0 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
21af0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
21b00 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
21b10 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
21b20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
21b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21b40 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
21b50 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
21b60 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
21b70 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
21ba0 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
21bb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
21bc0 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
21bf0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
21c00 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21c30 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
21c40 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21c50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21c60 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
21c70 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
21c80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21c90 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
21ca0 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
21cb0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
21cc0 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
21cd0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
21ce0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
21cf0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
21d00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21d30 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
21d40 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
21d50 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
21d60 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
21d70 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
21d80 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
21d90 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
21da0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
21db0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
21dc0 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
21dd0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
21de0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21df0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
21e00 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
21e10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21e20 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
21e30 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
21e40 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
21e50 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
21e60 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
21e70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
21e80 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
21e90 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
21ea0 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
21eb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21ec0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
21ed0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
21ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
21ef0 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
21f00 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
21f10 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
21f20 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
21f30 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65  gister(&tempX, e
21f40 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
21f50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
21f60 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
21f70 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
21f80 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
21f90 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f      memset(&opCo
21fa0 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mpare, 0, sizeof
21fb0 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20  (opCompare));.  
21fc0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
21fd0 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
21fe0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
21ff0 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
22000 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
22010 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
22020 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
22030 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
22040 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
22050 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
22060 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
22070 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
22080 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
22090 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
220a0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
220b0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
220c0 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
220d0 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
220e0 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
220f0 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
22100 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
22110 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
22120 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
22130 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
22150 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
22160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22170 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
22180 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
22190 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
221a0 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
221b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
221c0 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
221d0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
221e0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
221f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
22200 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
22210 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
22220 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
22230 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
22240 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22250 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22260 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
22270 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
22280 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22290 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
222a0 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
222b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
222c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
222d0 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
222e0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
222f0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
22300 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22310 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
22320 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
22330 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
22340 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
22350 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
22360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22370 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
22380 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
22390 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
223a0 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
223b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
223c0 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
223d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
223e0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
223f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22400 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22410 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
22420 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
22430 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
22440 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22450 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
22460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22480 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
22490 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
224a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
224b0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
224c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
224d0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
224e0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
224f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
22500 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
22510 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
22520 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
22530 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
22540 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22550 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
22560 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
22570 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
22580 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
22590 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
225a0 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
225b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
225c0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
225d0 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
225e0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
225f0 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
22600 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
22610 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
22620 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
22630 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
22640 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
22650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22660 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22670 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
22680 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
22690 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
226a0 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
226b0 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
226c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
226d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
226e0 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
226f0 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
22700 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22710 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
22720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22730 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22740 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
22750 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
22760 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
22770 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
22780 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
22790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
227a0 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
227b0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
227c0 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
227d0 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
227e0 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
227f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
22800 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
22820 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
22830 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
22840 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
22870 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
22880 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
22890 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
228a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
228b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
228c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
228d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
228e0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
228f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
22900 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
22910 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
22920 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
22930 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
22940 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
22950 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
22960 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
22970 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73  .**.** If regDes
22980 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65  t>=0 then the re
22990 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73  sult is always s
229a0 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65  tored in that re
229b0 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a  gister and the.*
229c0 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  * result is not 
229d0 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65  reusable.  If re
229e0 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69  gDest<0 then thi
229f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65  s routine is fre
22a00 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74  e to .** store t
22a10 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76  he value whereev
22a20 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68  er it wants.  Th
22a30 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
22a40 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22a50 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73  .** is stored is
22a60 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e   returned.  When
22a70 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20   regDest<0, two 
22a80 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73  identical expres
22a90 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f  sions will.** co
22aa0 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  de to the same r
22ab0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
22ac0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
22ad0 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
22ae0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
22af0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
22b00 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
22b10 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
22b20 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
22b30 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
22b40 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
22b50 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20  t regDest       
22b60 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
22b70 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
22b80 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
22b90 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
22ba0 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
22bb0 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
22bc0 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
22bd0 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44  Expr;.  if( regD
22be0 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20  est<0 && p ){.  
22bf0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
22c00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
22c10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
22c20 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
22c30 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
22c40 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
22c50 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
22c60 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
22c70 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
22c80 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
22c90 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
22ca0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
22cb0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
22cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22cd0 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
22ce0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
22cf0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
22d00 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
22d10 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
22d20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
22d30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
22d40 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
22d50 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
22d60 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
22d70 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
22d80 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
22d90 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
22da0 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
22db0 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
22dc0 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
22dd0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
22de0 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
22df0 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
22e00 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
22e10 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
22e20 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
22e30 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
22e40 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
22e50 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
22e60 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
22e70 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
22e80 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
22e90 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
22ea0 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
22eb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
22ec0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
22ed0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
22ee0 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
22ef0 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
22f00 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
22f10 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
22f20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
22f30 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
22f40 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
22f50 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
22f60 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
22f70 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
22f80 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
22f90 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
22fa0 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
22fb0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
22fc0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
22fd0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
22fe0 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
22ff0 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
23000 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
23010 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
23020 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
23030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
23040 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
23050 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
23060 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
23070 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
23080 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23090 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
230a0 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
230b0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
230c0 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
230d0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
230e0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
230f0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
23100 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
23110 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
23120 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
23130 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
23140 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
23150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
23160 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
23170 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
23180 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
23190 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
231a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
231b0 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
231c0 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
231d0 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
231e0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
231f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23200 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
23210 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
23220 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23230 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
23240 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
23250 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
23260 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
23270 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
23280 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
23290 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
232a0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
232b0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
232c0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
232d0 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
232e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
232f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23300 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
23310 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
23320 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
23330 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
23340 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
23350 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
23360 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
23370 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
23380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23390 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
233a0 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
233b0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
233c0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
233d0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
233e0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
233f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23400 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
23410 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
23420 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
23430 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
23440 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
23450 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
23460 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
23470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23480 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
23490 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
234a0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
234b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
234c0 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
234d0 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
234e0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
234f0 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
23500 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
23510 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
23520 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
23530 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
23540 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
23550 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
23560 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
23570 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
23580 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
23590 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
235a0 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
235b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
235c0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
235d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
235e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
235f0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
23600 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
23610 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
23620 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
23630 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23640 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
23650 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
23660 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
23670 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
23680 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
23690 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
236a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
236b0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
236c0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
236d0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
236e0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
236f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
23700 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
23710 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
23720 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23730 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
23740 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
23750 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
23760 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
23770 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
23780 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
23790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
237a0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
237b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
237c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
237d0 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
237e0 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
237f0 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
23800 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
23810 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
23820 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
23830 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
23840 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
23850 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
23860 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
23870 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
23880 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
23890 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
238a0 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
238b0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
238c0 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
238d0 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
238e0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
238f0 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
23900 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
23910 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
23920 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
23930 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
23940 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
23950 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
23960 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
23970 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
23980 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
23990 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
239a0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
239b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
239c0 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
239d0 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
239e0 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
239f0 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
23a00 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
23a10 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
23a20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
23a30 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
23a40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23a50 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
23a60 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23a70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
23a80 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
23a90 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
23aa0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
23ab0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
23ac0 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
23ad0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
23ae0 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
23af0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
23b00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
23b10 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
23b20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23b40 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
23b50 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
23b60 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
23b70 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
23b80 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23b90 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
23ba0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
23bb0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
23bc0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
23bd0 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
23be0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
23bf0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
23c00 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
23c10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
23c20 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
23c30 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a  s evaluated..**.
23c40 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
23c50 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
23c60 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
23c70 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
23c80 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
23c90 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
23ca0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
23cb0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
23cc0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
23cd0 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
23ce0 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
23cf0 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
23d00 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
23d10 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
23d20 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
23d30 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
23d40 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
23d50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
23d60 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
23d70 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
23d80 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
23d90 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
23da0 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
23db0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
23dc0 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
23dd0 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
23de0 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
23df0 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a   from there..*/.
23e00 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23e10 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
23e20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23e30 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
23e40 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
23e50 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
23e60 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
23e70 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
23e80 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
23e90 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
23ea0 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
23eb0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65  s */.  int srcRe
23ec0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  g,        /* Sou
23ed0 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66  rce registers if
23ee0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
23ef0 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
23f00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
23f10 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
23f20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
23f30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
23f40 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  tem;.  int i, j,
23f50 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20   n;.  u8 copyOp 
23f60 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23f70 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50  E_ECEL_DUP) ? OP
23f80 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  _Copy : OP_SCopy
23f90 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
23fa0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
23fb0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
23fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
23fd0 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
23fe0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
23ff0 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72  !=0 );  /* Never
24000 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f   gets this far o
24010 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20  therwise */.  n 
24020 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
24030 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74    if( !ConstFact
24040 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66  orOk(pParse) ) f
24050 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
24060 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66  ECEL_FACTOR;.  f
24070 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
24080 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
24090 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
240a0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
240b0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
240c0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
240d0 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
240e0 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
240f0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
24100 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
24110 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
24120 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
24130 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
24140 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
24150 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24170 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
24180 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
24190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
241a0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
241b0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
241c0 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74  TOR)!=0 && sqlit
241d0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
241e0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
241f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24200 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
24210 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
24220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24230 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
24240 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
24250 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
24260 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
24270 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
24280 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
24290 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
242a0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
242b0 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
242c0 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
242d0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
242e0 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
242f0 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
24300 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
24310 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
24320 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
24330 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
24340 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
24350 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
24360 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
24370 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
24380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24390 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
243a0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
243b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
243c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
243d0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
243e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
243f0 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
24400 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
24410 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
24420 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
24430 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
24440 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
24450 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
24460 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
24470 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
24480 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
24490 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
244a0 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
244b0 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
244c0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
244d0 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
244e0 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
24500 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
24510 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
24520 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
24530 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
24540 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
24550 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
24560 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24570 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
24580 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
24590 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
245a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
245b0 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
245c0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
245d0 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
245e0 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
245f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
24600 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
24610 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
24620 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24630 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
24640 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
24650 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
24660 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
24670 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
24680 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
24690 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
246a0 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
246b0 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
246c0 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
246d0 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
246e0 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
246f0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
24700 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
24710 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72  */.){. Expr expr
24720 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
24730 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
24740 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
24750 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
24760 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
24770 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
24780 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
24790 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
247a0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
247b0 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
247c0 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
247d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
247e0 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
247f0 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
24800 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73  ster */...  mems
24810 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c  et(&compLeft, 0,
24820 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
24830 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69    memset(&compRi
24840 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ght, 0, sizeof(E
24850 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
24860 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a  &exprAnd, 0, siz
24870 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61  eof(Expr));..  a
24880 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
24890 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
248a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
248b0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
248c0 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
248d0 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
248e0 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
248f0 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
24900 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
24910 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
24920 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
24930 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
24940 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
24950 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
24960 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
24970 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
24980 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
24990 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
249a0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
249b0 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
249c0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
249d0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
249e0 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
249f0 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72  ter(&exprX, expr
24a00 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
24a10 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
24a20 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a  ree1));.  if( xJ
24a30 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70  ump ){.    xJump
24a40 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
24a50 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
24a60 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
24a70 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65     /* Mark the e
24a80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69  xpression is bei
24a90 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  ng from the ON o
24aa0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
24ab0 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20  f a join.    ** 
24ac0 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  so that the sqli
24ad0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
24ae0 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  t() routine will
24af0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
24b00 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  move.    ** it i
24b10 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43  nto the Parse.pC
24b20 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20  onstExpr list.  
24b30 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20  We should use a 
24b40 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73  new bit for this
24b50 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61  ,.    ** for cla
24b60 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
24b70 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
24b80 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
24b90 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a  ield so we.    *
24ba0 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20  * have to reuse 
24bb0 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
24bc0 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f  bit.  Bummer. */
24bd0 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73  .    exprX.flags
24be0 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
24bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24c00 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
24c10 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
24c20 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
24c30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24c40 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
24c50 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
24c60 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
24c70 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
24c80 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24c90 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
24ca0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
24cb0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
24cc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
24cd0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
24ce0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
24cf0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
24d00 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
24d10 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
24d20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
24d30 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
24d40 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
24d50 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24d60 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
24d70 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
24d80 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
24d90 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
24da0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
24db0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
24dc0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
24dd0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
24de0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
24df0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
24e00 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
24e10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
24e20 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
24e30 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24e40 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24e50 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
24e60 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
24e70 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
24e80 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
24e90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
24ea0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
24eb0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
24ec0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24ed0 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ump==0 );.}../*.
24ee0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24ef0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
24f00 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
24f10 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
24f20 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
24f30 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
24f40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
24f50 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
24f60 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
24f70 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
24f80 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
24f90 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
24fa0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24fb0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
24fc0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
24fd0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
24fe0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
24ff0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
25000 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
25010 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
25020 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
25030 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
25040 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
25050 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
25060 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
25070 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
25080 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
25090 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
250a0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
250b0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
250c0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
250d0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
250e0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
250f0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
25100 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
25110 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
25120 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
25130 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
25140 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
25150 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
25160 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
25170 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
25180 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25190 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
251a0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
251b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
251c0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
251d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
251e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
251f0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
25200 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
25210 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
25220 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
25230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
25240 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
25250 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
25260 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
25270 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
25280 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
25290 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
252a0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
252b0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
252c0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
252d0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
252e0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
252f0 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
25300 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
25310 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
25320 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
25330 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
25340 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25350 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
25360 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25370 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
25380 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25390 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
253a0 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
253b0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
253c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
253d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
253e0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
253f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25400 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
25410 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
25420 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
25430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
25440 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
25450 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25460 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
25470 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
25480 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25490 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
254a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
254b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
254c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
254d0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
254e0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
254f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
25500 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25510 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
25520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25530 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
25540 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
25550 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25570 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
25580 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
25590 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
255a0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
255b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
255c0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
255d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
255e0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
255f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
25600 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25620 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
25630 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
25640 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
25650 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
25660 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25670 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
25680 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
25690 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
256a0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
256b0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
256c0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
256d0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
256e0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
256f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
25700 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
25710 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
25720 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
25730 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
25740 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
25750 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
25760 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
25770 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
25780 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
25790 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
257a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
257b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
257c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
257d0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
257e0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
257f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
25800 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
25810 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
25820 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
25830 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
25840 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25850 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
25860 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
25870 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
25880 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
258a0 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
258b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
258c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
258d0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
258e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
258f0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
25900 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
25910 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25920 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
25930 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
25940 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
25950 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
25960 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
25970 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
25980 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
25990 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
259a0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
259b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
259c0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
259d0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
259e0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
259f0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
25a00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25a10 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
25a20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
25a30 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
25a40 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25a50 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
25a60 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
25a70 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25a80 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
25a90 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
25aa0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
25ab0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25ac0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
25ad0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
25ae0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
25af0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25b00 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
25b10 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
25b20 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
25b30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25b40 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25b50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
25b60 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
25b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25b80 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
25b90 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
25ba0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
25bb0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
25bc0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
25bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
25be0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
25bf0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
25c00 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
25c10 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
25c20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
25c30 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
25c40 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
25c50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25c60 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
25c70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
25c90 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
25ca0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25cb0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
25cc0 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
25cd0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
25ce0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
25cf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
25d00 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
25d10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25d20 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
25d30 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
25d40 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25d50 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
25d60 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
25d70 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
25d80 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
25d90 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  True, jumpIfNull
25da0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25db0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
25dc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
25dd0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
25de0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
25df0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
25e00 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25e10 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
25e20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
25e30 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
25e40 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
25e50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25e60 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
25e70 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
25e80 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
25e90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25ea0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
25eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25ec0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25ed0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
25ee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25ef0 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
25f00 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
25f10 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69  lt_expr:.      i
25f20 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
25f30 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
25f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
25f50 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
25f60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
25f70 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
25f80 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
25f90 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* No-op */.    
25fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25fb0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
25fc0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
25fd0 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
25fe0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
25ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
26000 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
26010 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
26020 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
26030 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
26040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
26050 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
26060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26070 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
26090 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
260a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
260b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
260c0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
260d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
260e0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
260f0 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
26100 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
26110 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
26120 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
26130 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
26140 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
26150 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
26160 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
26170 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
26180 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
26190 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
261a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
261b0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
261c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
261d0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
261e0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
261f0 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
26200 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
26210 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
26220 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
26230 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
26240 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
26250 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
26260 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
26270 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
26280 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
26290 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
262a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
262b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
262c0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
262d0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
262e0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
262f0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
26300 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
26310 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
26320 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
26330 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26340 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
26350 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
26360 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
26370 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
26380 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
26390 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
263a0 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
263b0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
263c0 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
263d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
263e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
263f0 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
26400 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
26410 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
26420 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
26430 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
26440 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
26450 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
26460 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
26470 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
26480 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
26490 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
264a0 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
264b0 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
264c0 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
264d0 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
264e0 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
264f0 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
26500 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
26510 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
26520 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
26530 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
26540 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
26550 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
26560 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
26570 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
26580 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
26590 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
265a0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
265b0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
265c0 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
265d0 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
265e0 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
265f0 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
26600 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
26610 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
26620 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
26630 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
26640 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
26650 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
26660 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
26670 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
26680 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
26690 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
266a0 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
266b0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
266c0 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
266d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
266e0 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
266f0 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
26700 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
26710 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
26720 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
26730 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
26740 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
26750 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
26760 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
26770 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
26780 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
26790 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
267a0 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
267b0 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
267c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
267d0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
267e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
267f0 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
26800 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
26810 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
26820 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
26830 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
26840 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
26850 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
26860 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26870 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26880 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26890 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
268a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
268b0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
268c0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
268d0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
268e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
268f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26900 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26910 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
26920 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26930 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26940 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
26950 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26960 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
26970 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
26980 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26990 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
269a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
269b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
269c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
269d0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
269e0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
269f0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
26a00 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
26a10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26a20 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
26a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26a40 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
26a50 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
26a60 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26a70 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
26a80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
26a90 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
26aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26ab0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
26ac0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26ad0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
26ae0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
26af0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26b00 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
26b10 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26b20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26b30 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26b40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
26b50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26b60 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
26b70 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
26b80 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
26b90 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
26ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26bb0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
26bc0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
26bd0 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
26be0 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
26bf0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_EQ;.      jump
26c00 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
26c10 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
26c20 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
26c30 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
26c40 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
26c50 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
26c60 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
26c70 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
26c80 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
26c90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26ca0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
26cb0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
26cc0 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
26cd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26ce0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26cf0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
26d00 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26d10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26d20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
26d30 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
26d40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26d50 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26d60 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
26d70 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
26d80 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
26d90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
26da0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
26dd0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26de0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
26df0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
26e00 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
26e10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
26e20 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
26e30 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
26e40 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
26e50 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
26e60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26e70 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
26e80 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
26e90 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
26ea0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
26eb0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26ec0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
26ed0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
26ee0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26ef0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
26f00 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26f10 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
26f20 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
26f30 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26f40 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
26f50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26f60 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
26f70 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
26f80 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
26f90 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26fa0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
26fb0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
26fc0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
26fd0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
26fe0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26ff0 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
27000 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27010 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
27020 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27030 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27040 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27050 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27060 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27070 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27080 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27090 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
270a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
270b0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
270c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
270d0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
270e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
270f0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ULL: {.      r1 
27100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
27110 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
27120 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
27130 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
27140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27150 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
27160 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27170 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
27180 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  );   VdbeCoverag
27190 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
271a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
271b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
271c0 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f  TNULL );  VdbeCo
271d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
271e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
271f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27200 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27210 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27220 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
27230 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
27240 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27250 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
27260 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
27270 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
27280 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  , sqlite3ExprIfF
27290 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  alse, jumpIfNull
272a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
272b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
272c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
272d0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
272e0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
272f0 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
27300 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27310 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
27320 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
27330 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27340 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
27350 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
27360 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
27370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27380 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
27390 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
273a0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
273b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
273c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
273d0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
273e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
273f0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
27400 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
27410 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
27420 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72   .      if( expr
27430 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
27440 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
27450 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
27460 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
27470 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
27480 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
27490 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  .        /* no-o
274a0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
274b0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
274c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
274d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
274e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
274f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27500 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
27510 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
27520 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
27530 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
27540 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
27550 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27560 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
27570 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27580 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27590 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
275a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
275b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
275c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
275d0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
275e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
275f0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
27600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73  .}../*.** Like s
27610 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27620 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
27630 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  a copy is made o
27640 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a  f pExpr before.*
27650 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  * code generatio
27660 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79  n, and that copy
27670 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65   is deleted afte
27680 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  r code generatio
27690 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72  n. This.** ensur
276a0 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  es that the orig
276b0 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e  inal pExpr is un
276c0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
276d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
276e0 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50  lseDup(Parse *pP
276f0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
27700 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20  r, int dest,int 
27710 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73  jumpIfNull){.  s
27720 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
27730 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
27740 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33  *pCopy = sqlite3
27750 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
27760 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  r, 0);.  if( db-
27770 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
27780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
27790 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
277a0 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20  e, pCopy, dest, 
277b0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
277c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
277d0 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b  lete(db, pCopy);
277e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  .}.../*.** Do a 
277f0 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
27800 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
27810 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
27820 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
27830 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
27840 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
27850 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
27860 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
27870 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
27880 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
27890 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
278a0 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
278b0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
278c0 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
278d0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
278e0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
278f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
27900 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
27910 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
27920 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
27930 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
27940 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
27950 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
27960 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
27970 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
27980 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20  b..**.** The pA 
27990 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73  side might be us
279a0 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e  ing TK_REGISTER.
279b0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
279c0 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a   case and pB is.
279d0 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f  ** not using TK_
279e0 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20  REGISTER but is 
279f0 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61  otherwise equiva
27a00 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c  lent, then still
27a10 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
27a20 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
27a30 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
27a40 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
27a50 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
27a60 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
27a70 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
27a80 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
27a90 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
27aa0 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
27ab0 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
27ac0 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
27ad0 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
27ae0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
27af0 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
27b00 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
27b10 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
27b20 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
27b30 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
27b40 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
27b50 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
27b60 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
27b70 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
27b80 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
27b90 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
27ba0 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
27bb0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
27bc0 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
27bd0 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
27be0 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
27bf0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
27c00 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
27c10 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
27c20 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
27c30 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
27c40 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
27c50 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
27c60 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
27c70 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
27c80 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
27c90 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
27ca0 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e  b){.  u32 combin
27cb0 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  edFlags;.  if( p
27cc0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b  A==0 || pB==0 ){
27cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
27ce0 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a  pA ? 0 : 2;.  }.
27cf0 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20    combinedFlags 
27d00 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42  = pA->flags | pB
27d10 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63  ->flags;.  if( c
27d20 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
27d30 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
27d40 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
27d50 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e  &pB->flags&EP_In
27d60 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41  tValue)!=0 && pA
27d70 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e  ->u.iValue==pB->
27d80 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  u.iValue ){.    
27d90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
27da0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
27db0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
27dc0 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  !=pB->op ){.    
27dd0 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pA->op==TK_C
27de0 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
27df0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
27e00 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62  >pLeft, pB, iTab
27e10 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
27e20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
27e30 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
27e40 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
27e50 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
27e60 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
27e70 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
27e80 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
27e90 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
27ea0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
27eb0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f  _COLUMN && pA->o
27ec0 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
27ed0 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
27ee0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
27ef0 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
27f00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
27f10 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e  ite3StrICmp(pA->
27f20 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
27f30 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
27f40 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
27f50 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
27f60 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
27f70 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
27f80 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d    return pA->op=
27f90 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20  =TK_COLLATE ? 1 
27fa0 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  : 2;.    }.  }. 
27fb0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
27fc0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
27fd0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
27fe0 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
27ff0 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41  rn 2;.  if( ALWA
28000 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  YS((combinedFlag
28010 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
28020 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )==0) ){.    if(
28030 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
28040 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20   EP_xIsSelect ) 
28050 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
28060 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
28070 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
28080 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
28090 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
280a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
280b0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
280c0 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20  ht, pB->pRight, 
280d0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
280e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
280f0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
28100 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42  (pA->x.pList, pB
28110 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29  ->x.pList, iTab)
28120 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
28130 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
28140 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
28150 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20  Reduced)==0) && 
28160 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
28170 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G ){.      if( p
28180 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
28190 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
281a0 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
281b0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
281c0 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
281d0 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
281e0 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
281f0 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
28200 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
28210 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28220 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
28230 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
28240 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
28250 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
28260 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
28270 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
28280 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
28290 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
282a0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
282b0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
282c0 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
282d0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
282e0 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
282f0 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
28300 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
28310 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
28320 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28330 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
28340 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
28350 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
28360 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
28370 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
28380 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
28390 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
283a0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
283b0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
283c0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
283d0 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
283e0 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
283f0 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
28400 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
28410 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
28420 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
28430 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
28440 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
28450 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
28460 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
28470 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
28480 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
28490 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
284a0 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
284b0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
284c0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
284d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
284e0 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
284f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
28500 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
28510 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
28520 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
28530 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
28540 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
28550 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
28560 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
28570 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
28580 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
28590 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
285a0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
285b0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
285c0 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
285d0 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
285e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
285f0 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
28600 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
28610 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
28620 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28630 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
28640 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65  3ExprCompare() e
28650 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70  xcept COLLATE op
28660 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20 74  erators at the t
28670 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20  op-level.** are 
28680 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
28690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
286a0 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c  reSkip(Expr *pA,
286b0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
286c0 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Tab){.  return s
286d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
286e0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e(.             
286f0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
28700 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20  ollate(pA),.    
28710 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28720 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
28730 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pB),.           
28740 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a    iTab);.}../*.*
28750 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
28760 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
28770 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
28780 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
28790 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
287a0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
287b0 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
287c0 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
287d0 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
287e0 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
287f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
28800 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
28810 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
28820 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
28830 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
28840 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
28860 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
28870 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
28880 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
28890 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
288a0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
288b0 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
288c0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
288d0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
288e0 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
288f0 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
28900 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
28910 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
28920 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
28930 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
28940 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
28950 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
28960 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
28970 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
28980 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
28990 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
289a0 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
289b0 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
289c0 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
289d0 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
289e0 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
289f0 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
28a00 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
28a10 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
28a20 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
28a30 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
28a40 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
28a50 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
28a60 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
28a70 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
28a80 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
28a90 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
28aa0 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
28ab0 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
28ac0 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
28ad0 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
28ae0 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
28af0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
28b00 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
28b10 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
28b20 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
28b30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
28b40 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
28b50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
28b60 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
28b70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
28b80 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
28b90 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
28ba0 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
28bb0 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
28bc0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
28bd0 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
28be0 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
28bf0 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
28c00 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
28c10 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
28c20 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21  NULL && pE1->op!
28c30 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
28c40 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a  1->op!=TK_IS ){.
28c50 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73      Expr *pX = s
28c60 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
28c70 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74  llate(pE1->pLeft
28c80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
28c90 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20   pX!=pE1->pLeft 
28ca0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
28cb0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 58  e3ExprCompare(pX
28cc0 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
28cd0 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
28ce0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
28cf0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
28d00 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
28d10 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
28d20 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
28d30 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
28d40 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
28d50 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
28d60 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
28d70 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
28d80 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
28d90 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
28da0 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
28db0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
28dc0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
28dd0 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
28de0 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
28df0 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
28e00 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
28e10 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
28e20 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
28e30 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
28e40 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
28e50 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
28e60 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
28e70 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
28e80 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
28e90 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
28ea0 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
28eb0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
28ec0 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
28ed0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
28ee0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
28ef0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
28f00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
28f10 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
28f20 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
28f30 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
28f40 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
28f50 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
28f60 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
28f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
28f80 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
28f90 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
28fa0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
28fb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
28fc0 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
28fd0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
28fe0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
28ff0 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
29000 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
29010 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
29020 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
29030 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
29040 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
29050 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
29060 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29070 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
29080 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
29090 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
290a0 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
290b0 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
290c0 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
290d0 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
290e0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
290f0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
29100 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
29110 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
29120 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
29130 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
29140 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
29150 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
29160 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
29170 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
29180 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
29190 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
291a0 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
291b0 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
291c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
291d0 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
291e0 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
291f0 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
29200 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
29210 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
29220 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
29230 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
29240 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
29250 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
29260 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
29270 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
29280 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
29290 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
292a0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
292b0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
292c0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
292d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
292e0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
292f0 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
29300 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
29310 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
29320 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
29330 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
29340 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
29350 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
29360 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
29370 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
29380 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
29390 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
293a0 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
293b0 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
293c0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
293d0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
293e0 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
293f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
29400 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
29410 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
29420 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
29430 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
29440 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
29450 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
29460 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
29470 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
29480 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
29490 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
294a0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
294b0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
294c0 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
294d0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
294e0 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
294f0 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
29500 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
29510 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
29520 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
29530 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
29540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
29550 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
29560 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
29570 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
29580 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29590 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
295a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
295b0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
295c0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
295d0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
295e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
295f0 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
29600 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
29610 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
29620 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
29630 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
29640 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
29650 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
29660 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
29670 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
29680 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
29690 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
296a0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
296b0 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
296c0 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
296d0 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
296e0 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
296f0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
29700 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
29710 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
29720 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
29730 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
29740 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
29750 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
29760 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
29770 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
29780 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
29790 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
297a0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
297b0 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
297c0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
297d0 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
297e0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
297f0 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
29800 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
29810 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
29820 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
29830 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
29840 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
29850 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
29860 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
29870 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
29880 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29890 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
298a0 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
298b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
298c0 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
298d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
298e0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
298f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
29900 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
29910 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
29920 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
29930 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
29940 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
29950 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
29960 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
29970 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
29980 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
29990 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
299a0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
299b0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
299c0 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
299d0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
299e0 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
299f0 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
29a00 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
29a10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29a20 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
29a30 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
29a40 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
29a50 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
29a60 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
29a70 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
29a80 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
29a90 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
29aa0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
29ab0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
29ac0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
29ad0 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
29ae0 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
29af0 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
29b00 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
29b10 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
29b20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
29b30 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
29b40 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
29b50 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
29b60 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
29b70 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
29b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
29b90 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
29ba0 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
29bb0 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
29bc0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
29bd0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
29be0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
29bf0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
29c00 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
29c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
29c20 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
29c30 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
29c40 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
29c50 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
29c60 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
29c70 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
29c80 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
29c90 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
29ca0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
29cb0 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
29cc0 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
29cd0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
29ce0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
29cf0 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
29d00 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
29d10 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
29d20 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
29d30 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
29d40 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
29d50 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
29d60 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
29d70 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
29d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
29d90 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
29da0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
29db0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
29dc0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
29dd0 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
29de0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
29df0 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
29e00 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
29e10 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
29e20 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
29e30 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
29e40 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
29e50 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
29e60 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
29e70 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
29e80 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
29e90 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
29ea0 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
29eb0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
29ec0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
29ed0 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
29ee0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
29ef0 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
29f00 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
29f10 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
29f20 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
29f30 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
29f40 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
29f50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
29f60 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
29f70 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
29f80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
29f90 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
29fa0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
29fb0 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
29fc0 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
29fd0 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
29fe0 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
29ff0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2a000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2a010 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
2a020 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
2a030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2a040 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2a050 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2a060 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2a070 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2a080 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
2a090 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2a0a0 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
2a0b0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
2a0c0 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
2a0d0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
2a0e0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2a0f0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
2a100 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
2a110 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
2a120 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a130 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
2a140 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
2a150 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
2a160 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2a170 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2a180 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2a190 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
2a1a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a1b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a1c0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2a1d0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2a1e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2a1f0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2a200 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2a210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2a220 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2a230 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
2a240 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
2a250 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
2a260 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2a270 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
2a280 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
2a290 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2a2a0 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
2a2b0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
2a2c0 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
2a2d0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
2a2e0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2a2f0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
2a300 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2a310 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
2a320 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
2a330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a340 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
2a350 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
2a360 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
2a370 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
2a380 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
2a390 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
2a3a0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
2a3b0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2a3c0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2a3d0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2a3e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2a3f0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2a400 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2a410 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2a420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a430 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2a440 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a450 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
2a460 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
2a470 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
2a480 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
2a490 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2a4a0 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
2a4b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2a4c0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
2a4d0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a4f0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
2a500 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
2a510 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
2a520 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
2a530 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
2a540 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
2a550 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
2a560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a570 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
2a580 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2a590 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a5a0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2a5b0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2a5c0 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
2a5d0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2a5e0 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
2a5f0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
2a620 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
2a630 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
2a640 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2a660 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2a670 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
2a680 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
2a690 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
2a6a0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2a6b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
2a6c0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
2a6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6e0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
2a6f0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a710 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
2a720 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
2a730 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
2a740 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
2a750 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
2a760 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
2a770 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2a790 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2a7a0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
2a7b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a7d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a800 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2a810 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
2a820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a830 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2a840 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
2a850 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
2a860 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2a870 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a880 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
2a890 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
2a8a0 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
2a8b0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
2a8c0 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
2a8d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
2a8e0 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
2a8f0 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
2a900 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
2a910 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
2a920 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
2a930 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
2a940 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
2a950 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
2a960 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2a970 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2a980 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
2a990 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2a9a0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2a9b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2a9c0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2a9d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2a9e0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2a9f0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
2aa00 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
2aa10 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
2aa20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
2aa30 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
2aa40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2aa50 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
2aa60 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
2aa70 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
2aa80 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
2aa90 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
2aaa0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
2aab0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
2aac0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2aad0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
2aae0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
2aaf0 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
2ab00 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
2ab10 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
2ab20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
2ab30 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
2ab40 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
2ab50 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2ab60 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
2ab70 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
2ab80 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
2ab90 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
2aba0 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
2abb0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
2abc0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2abd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2abe0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2abf0 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
2ac00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2ac10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2ac20 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2ac30 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
2ac40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2ac50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2ac60 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
2ac70 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
2ac80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ac90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2aca0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2acb0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
2acc0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
2acd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
2ace0 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
2acf0 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
2ad00 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
2ad10 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
2ad20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
2ad30 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
2ad40 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
2ad50 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
2ad60 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
2ad70 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
2ad80 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
2ad90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2ada0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2adb0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2adc0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2add0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2ade0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
2adf0 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
2ae00 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
2ae10 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2ae20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
2ae30 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2ae40 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2ae50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2ae60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2ae70 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2ae90 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
2aea0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
2aeb0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2aed0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a  xpr->u.zToken, .
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
2af00 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
2af10 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
2af20 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
2af30 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
2af40 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2af50 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
2af60 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2af70 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
2af80 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
2af90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2afa0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2afb0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2afc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2afd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2afe0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
2aff0 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
2b000 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
2b010 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
2b020 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
2b030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
2b040 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2b050 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2b060 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2b070 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2b080 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2b090 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2b0a0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2b0b0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2b0c0 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
2b0d0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2b0e0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2b0f0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2b100 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
2b110 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b120 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
2b130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b140 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2b150 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2b160 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2b170 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
2b180 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2b190 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2b1a0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2b1b0 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
2b1c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b1d0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
2b1e0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2b1f0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
2b200 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
2b210 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
2b220 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
2b230 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
2b240 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
2b250 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
2b260 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
2b270 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
2b280 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
2b290 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
2b2a0 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
2b2b0 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
2b2c0 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
2b2d0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
2b2e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2b2f0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2b300 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
2b310 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
2b320 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
2b330 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
2b340 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
2b350 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2b360 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b370 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2b380 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
2b390 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
2b3a0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2b3b0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
2b3c0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
2b3d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
2b3e0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2b3f0 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2b400 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
2b410 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
2b420 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2b430 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
2b440 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2b450 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
2b460 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
2b470 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b480 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
2b490 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
2b4a0 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
2b4b0 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
2b4c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2b4d0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
2b4e0 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
2b4f0 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
2b500 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
2b510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2b520 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2b530 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2b540 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2b550 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
2b560 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2b570 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
2b580 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2b590 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
2b5a0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
2b5b0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
2b5c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
2b5d0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2b5e0 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
2b5f0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
2b600 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2b610 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
2b620 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
2b630 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
2b640 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
2b650 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
2b660 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2b670 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2b680 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2b690 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
2b6a0 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
2b6b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
2b6c0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
2b6d0 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
2b6e0 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
2b6f0 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2b700 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
2b710 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
2b720 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
2b730 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
2b740 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
2b750 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
2b760 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
2b770 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
2b780 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
2b790 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
2b7a0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
2b7b0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2b7c0 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
2b7d0 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
2b7e0 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
2b7f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
2b800 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
2b810 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2b820 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
2b830 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
2b840 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
2b850 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2b860 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2b870 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
2b880 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
2b890 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
2b8a0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
2b8b0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
2b8c0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
2b8d0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
2b8e0 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
2b8f0 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
2b900 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2b910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b920 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2b930 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
2b940 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
2b950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2b960 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
2b970 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
2b980 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
2b990 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  isters..*/.int s
2b9a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2b9b0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2b9c0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2b9d0 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e  nt i, n;.  if( n
2b9e0 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20  Reg==1 ) return 
2b9f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2ba00 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d  g(pParse);.  i =
2ba10 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2ba20 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
2ba30 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
2ba40 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20  f( nReg<=n ){.  
2ba50 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41    assert( !usedA
2ba60 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
2ba70 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29  rse, i, i+n-1) )
2ba80 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2ba90 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2baa0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2bab0 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2bac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2bad0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2bae0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2baf0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2bb00 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2bb10 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2bb20 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2bb30 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2bb40 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2bb50 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2bb60 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2bb70 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2bb80 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2bb90 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
2bba0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
2bbb0 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
2bbc0 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67  Reg);.  if( nReg
2bbd0 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
2bbe0 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
2bbf0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
2bc00 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
2bc10 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
2bc20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
2bc30 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
2bc40 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
2bc50 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
2bc60 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76   for reuse..*/.v
2bc70 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
2bc80 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72  TempRegCache(Par
2bc90 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
2bca0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
2bcb0 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
2bcc0 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.
2bcd0 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20  ./*.** Validate 
2bce0 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72  that no temporar
2bcf0 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73  y register falls
2bd00 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
2bd10 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e  e of.** iFirst..
2bd20 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
2bd30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2bd40 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f  is only call fro
2bd50 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  m within assert(
2bd60 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
2bd70 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2bd80 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69  E_DEBUG.int sqli
2bd90 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67  te3NoTempsInRang
2bda0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2bdb0 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74   int iFirst, int
2bdc0 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69   iLast){.  int i
2bdd0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2bde0 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26  nRangeReg>0.   &
2bdf0 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2be00 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg+pParse->nRan
2be10 67 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26  geReg<iLast.   &
2be20 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2be30 52 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b  Reg>=iFirst.  ){
2be40 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
2be50 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2be60 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
2be70 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
2be80 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2be90 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20  g[i]>=iFirst && 
2bea0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2beb0 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  [i]<=iLast ){.  
2bec0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2bed0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2bee0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
2bef0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.