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

Artifact 8c224aa28278a5c1eed55247b7a571ff388ad5c2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
2f80: 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65  r->op2==0 || pVe
2f90: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ctor->op==TK_REG
2fa0: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28  ISTER );.    if(
2fb0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2fc0: 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74  _SELECT || pVect
2fd0: 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45  or->op2==TK_SELE
2fe0: 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  CT ){.      retu
2ff0: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53  rn pVector->x.pS
3000: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
3010: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
3030: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c  rn pVector->x.pL
3040: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
3050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3060: 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 23  urn pVector;.}.#
3070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
3090: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69 66 6e  BQUERY) */..#ifn
30a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30b0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43  SUBQUERY./*.** C
30c0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
30d0: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
30e0: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
30f0: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3100: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3110: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
3120: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
3130: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
3140: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
3150: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
3170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3180: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3190: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
31a0: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
31b0: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
31c0: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
31d0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
31e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3200: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3210: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3220: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
3230: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
3240: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
3250: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
3260: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
3270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3280: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3290: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
32a0: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
32b0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
32c0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
32d0: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
32e0: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
32f0: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3300: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3310: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
3320: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
3330: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
3340: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
3350: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
3360: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
3370: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3380: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3390: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
33a0: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
33b0: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
33c0: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
33d0: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
33e0: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
33f0: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3400: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3410: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
3420: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
3430: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
3440: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
3450: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3460: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
3470: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3480: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3490: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
34b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34c0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
34d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
34e0: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
34f0: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3500: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3510: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
3520: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
3530: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
3540: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
3550: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
3560: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3570: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3580: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3590: 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  or->flags & EP_x
35a0: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
35b0: 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54  /* The TK_SELECT
35c0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64  _COLUMN Expr nod
35d0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
35e0: 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20   pLeft:         
35f0: 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69    pVector contai
3600: 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a 20  ning TK_SELECT. 
3610: 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20     ** pRight:   
3620: 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e         not used.
3630: 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c    But recursivel
3640: 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  y deleted..    *
3650: 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20  * iColumn:      
3660: 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f     Index of a co
3670: 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a  lumn in pVector.
3680: 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54      ** pLeft->iT
3690: 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e  able:   First in
36a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
36b0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
36c0: 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a  sult, or 0.    *
36d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36e0: 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74     if the result
36f0: 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70   is not yet comp
3700: 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
3710: 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   ** sqlite3ExprD
3720: 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63  elete() specific
3730: 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72  ally skips the r
3740: 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20  ecursive delete 
3750: 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20  of.    ** pLeft 
3760: 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  on TK_SELECT_COL
3770: 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  UMN nodes.  But 
3780: 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77  pRight is follow
3790: 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20  ed, so pVector. 
37a0: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74     ** can be att
37b0: 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20  ached to pRight 
37c0: 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f  to cause this no
37d0: 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72  de to take owner
37e0: 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70  ship of.    ** p
37f0: 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c  Vector.  Typical
3800: 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ly there will be
3810: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
3820: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
3830: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
3840: 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e   same pLeft poin
3850: 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74  ter to the pVect
3860: 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65  or, but only one
3870: 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
3880: 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65  will own the pVe
3890: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
38a0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50   pRet = sqlite3P
38b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
38c0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30  SELECT_COLUMN, 0
38d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
38e0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
38f0: 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Ret->iColumn = i
3900: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65  Field;.      pRe
3910: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74  t->pLeft = pVect
3920: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
3930: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c  sert( pRet==0 ||
3940: 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30   pRet->iTable==0
3950: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
3960: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3970: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56  ==TK_VECTOR ) pV
3980: 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d  ector = pVector-
3990: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
39a0: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  ld].pExpr;.    p
39b0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
39c0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
39d0: 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20   pVector, 0);.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
39f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
3a00: 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54  fine(SQLITE_OMIT
3a10: 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f  _SUBQUERY) */../
3a20: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3a30: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3a40: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3a50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3a60: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3a70: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3a80: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3a90: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3aa0: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3ab0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3ac0: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ad0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3ae0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3af0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3b00: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3b10: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3b20: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3b30: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3b40: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3b50: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3b60: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3b70: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3b80: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3b90: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3ba0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3bb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3bc0: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3bd0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3be0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3bf0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3c00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
3c10: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
3c20: 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a    return reg;.}.
3c30: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
3c40: 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20 74  pVector points t
3c50: 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72 65  o a vector expre
3c60: 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20 61  ssion - either a
3c70: 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72   TK_VECTOR.** or
3c80: 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74 20   TK_SELECT that 
3c90: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3ca0: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68  n one column. Th
3cb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
3cc0: 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  rns.** the regis
3cd0: 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  ter number of a 
3ce0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f  register that co
3cf0: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
3d00: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69   of.** element i
3d10: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63  Field of the vec
3d20: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56  tor..**.** If pV
3d30: 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45  ector is a TK_SE
3d40: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
3d50: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 69   then code for i
3d60: 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a 20  t must have .** 
3d70: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
3d80: 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  erated using the
3d90: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3da0: 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e  ct() routine. In
3db0: 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70 61   this.** case pa
3dc0: 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65 63  rameter regSelec
3dd0: 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  t should be the 
3de0: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
3df0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 2a  y of registers.*
3e00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
3e10: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
3e20: 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a  sub-select. .**.
3e30: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
3e40: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
3e50: 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  OR, then code fo
3e60: 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
3e70: 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65  field.** is gene
3e80: 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  rated. In this c
3e90: 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29 20  ase (*pRegFree) 
3ea0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74 68  may be set to th
3eb0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  e number of.** a
3ec0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
3ed0: 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64 20  ter to be freed 
3ee0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65  by the caller be
3ef0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
3f00: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
3f10: 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20 70  urning, output p
3f20: 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78 70  arameter (*ppExp
3f30: 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  r) is set to poi
3f40: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70  nt to the.** Exp
3f50: 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  r object corresp
3f60: 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e  onding to elemen
3f70: 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20 76  t iElem of the v
3f80: 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ector..*/.static
3f90: 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72 52   int exprVectorR
3fa0: 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65  egister(.  Parse
3fb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3fd0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
3fe0: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65 78   /* Vector to ex
4010: 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66 72  tract element fr
4020: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65  om */.  int iFie
4030: 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
4040: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4050: 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
4060: 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e   pVector */.  in
4070: 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20 20  t regSelect,    
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4090: 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20   First in array 
40a0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
40b0: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c    Expr **ppExpr,
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65 73    /* OUT: Expres
40e0: 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  sion element */.
40f0: 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65 20    int *pRegFree 
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72    /* OUT: Temp r
4120: 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
4130: 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20  */.){.  u8 op = 
4140: 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61  pVector->op;.  a
4150: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45  ssert( op==TK_VE
4160: 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  CTOR || op==TK_R
4170: 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54  EGISTER || op==T
4180: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 69 66  K_SELECT );.  if
4190: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
41a0: 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  R ){.    *ppExpr
41b0: 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
41c0: 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56 65  FieldSubexpr(pVe
41d0: 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20  ctor, iField);. 
41e0: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
41f0: 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c 64  r->iTable+iField
4200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
4210: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
4220: 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74   *ppExpr = pVect
4230: 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  or->x.pSelect->p
4240: 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  EList->a[iField]
4250: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65 74  .pExpr;.     ret
4260: 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69 46  urn regSelect+iF
4270: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  ield;.  }.  *ppE
4280: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4290: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
42a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  ].pExpr;.  retur
42b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
42c0: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a 70  eTemp(pParse, *p
42d0: 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65 29  pExpr, pRegFree)
42e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
42f0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
4300: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
4310: 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20 76  een two vector v
4320: 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a  alues. Compute.*
4330: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
4340: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28  the comparison (
4350: 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61  1, 0, or NULL) a
4360: 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  nd write that.**
4370: 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
4380: 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a  ister dest..**.*
4390: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
43a0: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66 6f  t satisfy the fo
43b0: 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64 69  llowing precondi
43c0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tions:.**.**    
43d0: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
43e0: 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b  _IS:      op==TK
43f0: 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _EQ and p5==SQLI
4400: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4410: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
4420: 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b  _ISNOT:   op==TK
4430: 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _NE and p5==SQLI
4440: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4450: 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20 20  otherwise:      
4460: 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70 45            op==pE
4470: 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d  xpr->op and p5==
4480: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  0.*/.static void
4490: 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
44a0: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
44b0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  rse,        /* C
44c0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 6f  ode generator co
44d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
44e0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
44f0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
4500: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
4510: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
4520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4530: 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68   results into th
4540: 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
4550: 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20   u8 op,         
4560: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
4570: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
4580: 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
4590: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
45a0: 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72  TE_NULLEQ or zer
45b0: 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  o */.){.  Vdbe *
45c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
45d0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  e;.  Expr *pLeft
45e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
45f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
4600: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
4610: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73  .  int nLeft = s
4620: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4630: 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69  Size(pLeft);.  i
4640: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c  nt i;.  int regL
4650: 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  eft = 0;.  int r
4660: 65 67 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 75  egRight = 0;.  u
4670: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e  8 opx = op;.  in
4680: 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c  t addrDone = sql
4690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
46a0: 6c 28 76 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  l(v);..  assert(
46b0: 20 6e 4c 65 66 74 3d 3d 73 71 6c 69 74 65 33 45   nLeft==sqlite3E
46c0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46d0: 69 67 68 74 29 20 29 3b 0a 20 20 61 73 73 65 72  ight) );.  asser
46e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
46f0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
4700: 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20  ==TK_NE .       
4710: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4720: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
4730: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20  ==TK_ISNOT .    
4740: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4750: 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_LT || pExpr-
4760: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20  >op==TK_GT .    
4770: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4780: 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_LE || pExpr-
4790: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b  >op==TK_GE .  );
47a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
47b0: 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78  ->op==op || (pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26  pr->op==TK_IS &&
47d0: 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20   op==TK_EQ).    
47e0: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70          || (pExp
47f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
4800: 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b  && op==TK_NE) );
4810: 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30  .  assert( p5==0
4820: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f   || pExpr->op!=o
4830: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
4840: 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  5==SQLITE_NULLEQ
4850: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f   || pExpr->op==o
4860: 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51  p );..  p5 |= SQ
4870: 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20  LITE_STOREP2;.  
4880: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29  if( opx==TK_LE )
4890: 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20   opx = TK_LT;.  
48a0: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29  if( opx==TK_GE )
48b0: 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20   opx = TK_GT;.. 
48c0: 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72 43   regLeft = exprC
48d0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
48e0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72  rse, pLeft);.  r
48f0: 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43 6f  egRight = exprCo
4900: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
4910: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20 20  se, pRight);..  
4920: 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f  for(i=0; 1 /*Loo
4930: 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65 61  p exits by "brea
4940: 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  k"*/; i++){.    
4950: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
4960: 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  , regFree2 = 0;.
4970: 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70      Expr *pL, *p
4980: 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c 20  R; .    int r1, 
4990: 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r2;.    assert( 
49a0: 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74 20  i>=0 && i<nLeft 
49b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  );.    if( i>0 )
49c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
49d0: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
49e0: 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74     r1 = exprVect
49f0: 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73  orRegister(pPars
4a00: 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67  e, pLeft, i, reg
4a10: 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46  Left, &pL, &regF
4a20: 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20  ree1);.    r2 = 
4a30: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4a40: 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  er(pParse, pRigh
4a50: 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20  t, i, regRight, 
4a60: 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &pR, &regFree2);
4a70: 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65  .    codeCompare
4a80: 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c  (pParse, pL, pR,
4a90: 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65   opx, r1, r2, de
4aa0: 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73  st, p5);.    tes
4ab0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4ac0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4ad0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4ae0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
4af0: 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
4b00: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
4b10: 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Le);.    testcas
4b20: 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
4b30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
4b40: 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74  p==OP_Gt);.    t
4b50: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
4b60: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4b70: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
4b80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b90: 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
4ba0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4bb0: 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Eq);.    testc
4bc0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
4bd0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4be0: 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
4bf0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4c00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4c10: 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71  egFree1);.    sq
4c20: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4c30: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4c40: 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69  ree2);.    if( i
4c50: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
4c60: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
4c70: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
4c80: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
4c90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4ca0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
4cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4cd0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
4ce0: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
4cf0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
4d00: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
4d10: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
4d20: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
4d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d50: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4d60: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4d70: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
4d80: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
4d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4da0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
4db0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
4dc0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
4dd0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
4de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4df0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
4e00: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
4e10: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
4e20: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4e30: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
4e40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4e50: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
4e60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4e70: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
4e80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
4e90: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4ea0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
4eb0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
4ec0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
4ed0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
4ee0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
4ef0: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
4f00: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
4f10: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
4f20: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
4f30: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
4f40: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
4f50: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
4f60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
4f70: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
4f80: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
4f90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
4fa0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
4fb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
4fc0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
4fd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
4fe0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
4ff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5000: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5010: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5020: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5030: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5040: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5050: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5060: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5070: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
5080: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
5090: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
50a0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
50b0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
50c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
50d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
50e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
50f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5100: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5110: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5120: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5130: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5140: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5150: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5160: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5170: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
5180: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5190: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
51a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
51b0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
51c0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
51d0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
51e0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
51f0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5200: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5210: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5220: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5230: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5240: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5250: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5260: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5270: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
5280: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5290: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
52a0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
52b0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
52c0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
52d0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
52e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
52f0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5300: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5310: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5320: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5330: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5340: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5350: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5360: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5370: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
5380: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
5390: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
53a0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
53b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
53c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
53d0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
53e0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
53f0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5400: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
5410: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5420: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5430: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5440: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5450: 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65  OfExpr(p->pOffse
5460: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
5470: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5480: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e  st(p->pEList, pn
5490: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
54a0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
54b0: 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69  >pGroupBy, pnHei
54c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
54d0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  OfExprList(p->pO
54e0: 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74  rderBy, pnHeight
54f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  );.    heightOfS
5500: 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c  elect(p->pPrior,
5510: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   pnHeight);.  }.
5520: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5530: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5540: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74  riable in the st
5550: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
5560: 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  s an .** argumen
5570: 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  t. An expression
5580: 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65   with no childre
5590: 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72  n, Expr.pList or
55a0: 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63   .** Expr.pSelec
55b0: 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68  t member has a h
55c0: 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20  eight of 1. Any 
55d0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
55e0: 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74  .** has a height
55f0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
5600: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5610: 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65  any other .** re
5620: 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c  ferenced Expr pl
5630: 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  us one..**.** Al
5640: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f  so propagate EP_
5650: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5660: 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70  up from Expr.x.p
5670: 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61  List to Expr.fla
5680: 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70  gs,.** if approp
5690: 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
56a0: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
56b0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
56c0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
56d0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
56e0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
56f0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
5700: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5710: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
5720: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5730: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
5740: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5750: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
5760: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
5770: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78    }else if( p->x
5780: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65  .pList ){.    he
5790: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
57a0: 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69  ->x.pList, &nHei
57b0: 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  ght);.    p->fla
57c0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
57d0: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
57e0: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
57f0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  List);.  }.  p->
5800: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
5810: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
5820: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
5830: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
5840: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
5850: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
5860: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
5870: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
5880: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
5890: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
58a0: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
58b0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
58c0: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  arse..**.** Also
58d0: 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   propagate all E
58e0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
58f0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5900: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5910: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5920: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5930: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5940: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5950: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5960: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
5970: 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65  return;.  exprSe
5980: 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71  tHeight(p);.  sq
5990: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
59a0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
59b0: 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a  nHeight);.}../*.
59c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
59d0: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
59e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
59f0: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
5a00: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
5a10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5a20: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5a30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5a40: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5a50: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5a60: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5a70: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5a80: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5a90: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5aa0: 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45  }.#else /* ABOVE
5ab0: 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  :  Height enforc
5ac0: 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20  ement enabled.  
5ad0: 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e  BELOW: Height en
5ae0: 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f  forcement off */
5af0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65  ./*.** Propagate
5b00: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
5b10: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
5b20: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
5b30: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
5b40: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
5b50: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
5b60: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
5b70: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
5b80: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78  .  if( p && p->x
5b90: 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48  .pList && !ExprH
5ba0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5bb0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5bc0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bd0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5be0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5bf0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5c00: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78    }.}.#define ex
5c10: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
5c20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5c30: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
5c40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
5c50: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
5c60: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
5c70: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
5c80: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
5c90: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
5ca0: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
5cb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
5cc0: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
5cd0: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
5ce0: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
5cf0: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
5d00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
5d10: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5d20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
5d30: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
5d40: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
5d50: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
5d60: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
5d70: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
5d80: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
5d90: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
5da0: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
5db0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
5dc0: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
5dd0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
5de0: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
5df0: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  g is performed. 
5e00: 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20   The deQuote.** 
5e10: 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
5e20: 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69  ored if pToken i
5e30: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
5e40: 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a   token does not.
5e50: 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ** appear to be 
5e60: 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20  quoted.  If the 
5e70: 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74  quotes were of t
5e80: 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64  he form "..." (d
5e90: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a  ouble-quotes).**
5ea0: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c   then the EP_Dbl
5eb0: 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73  Quoted flag is s
5ec0: 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  et on the expres
5ed0: 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sion node..**.**
5ee0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
5ef0: 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  If op==TK_INTEGE
5f00: 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69  R and pToken poi
5f10: 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  nts to a string 
5f20: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74  that.** can be t
5f30: 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61  ranslated into a
5f40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
5f50: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5f60: 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64  is not.** stored
5f70: 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49   in u.zToken.  I
5f80: 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65  nstead, the inte
5f90: 67 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72  ger values is wr
5fa0: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e  itten.** into u.
5fb0: 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45  iValue and the E
5fc0: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
5fd0: 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72  is set.  No extr
5fe0: 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20  a storage.** is 
5ff0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
6000: 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65  d the integer te
6010: 78 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f  xt and the dequo
6020: 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72  te flag is ignor
6030: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
6040: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20  ite3ExprAlloc(. 
6050: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6060: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
6070: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
6080: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f  MallocRawNN() */
6090: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
60a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
60b0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
60c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
60d0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
60e0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
60f0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6100: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
6110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6120: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
6130: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
6140: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
6150: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
6160: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
6170: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
6180: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
6190: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
61a0: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
61b0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
61c0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
61d0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
61e0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
61f0: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
6200: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
6210: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
6220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
6230: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6240: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
6250: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
6260: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
6270: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
6280: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
6290: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
62a0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
62b0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
62c0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
62d0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
62e0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
62f0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
6300: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
6310: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
6320: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
6330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6340: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
6350: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
6360: 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
6370: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
6380: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30   || pToken->n==0
6390: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
63a0: 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63  pToken->n ) memc
63b0: 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  py(pNew->u.zToke
63c0: 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  n, pToken->z, pT
63d0: 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  oken->n);.      
63e0: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
63f0: 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b  [pToken->n] = 0;
6400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71  .        if( deq
6410: 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49  uote && sqlite3I
6420: 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  squote(pNew->u.z
6430: 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20  Token[0]) ){.   
6440: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
6450: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22  >u.zToken[0]=='"
6460: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
6470: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
6480: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6490: 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Dequote(pNew->
64a0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
64b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
64c0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
64d0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
64e0: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
64f0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
6500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
6510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
6520: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
6530: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
6540: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
6550: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
6560: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
6570: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
6580: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
6590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
65a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
65b0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
65c0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
65d0: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
65e0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
65f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6600: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6610: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6620: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
6630: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
6640: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
6650: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
6660: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
6670: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
6680: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6690: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
66a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
66b0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
66c0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
66d0: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
66e0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
66f0: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
6700: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
6710: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
6720: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
6730: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
6740: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
6750: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
6760: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
6770: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6780: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
6790: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
67a0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
67b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
67c0: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
67d0: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
67e0: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
67f0: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
6800: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6810: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6830: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
6840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6850: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
6860: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6870: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
6880: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
6890: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
68a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
68b0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
68c0: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
68d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
68e0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
68f0: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
6900: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
6910: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6920: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
6930: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
6940: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
6950: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
6960: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6970: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
6980: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
6990: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
69a0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
69b0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
69c0: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
69d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
69e0: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
69f0: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
6a00: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
6a10: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
6a20: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6a30: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
6a40: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
6a50: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
6a60: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
6a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6a80: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6a90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6aa0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6ac0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6ad0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
6ae0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
6af0: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
6b00: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
6b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
6b20: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
6b30: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
6b40: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
6b50: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
6b60: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
6b70: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
6b80: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
6b90: 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61  ){.    /* Take a
6ba0: 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72  dvantage of shor
6bb0: 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20  t-circuit false 
6bc0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
6bd0: 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20   AND */.    p = 
6be0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
6bf0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74  Parse->db, pLeft
6c00: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
6c10: 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  se{.    p = sqli
6c20: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
6c30: 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b  rse->db, op & TK
6c40: 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e  FLG_MASK, pToken
6c50: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6c60: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
6c70: 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ees(pParse->db, 
6c80: 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  p, pLeft, pRight
6c90: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  );.  }.  if( p )
6ca0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
6cb0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
6cc0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
6cd0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6ce0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
6cf0: 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45  pSelect to the E
6d00: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69  xpr.x.pSelect fi
6d10: 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78  eld.  Or, if pEx
6d20: 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a  pr is NULL (due.
6d30: 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61  ** do a memory a
6d40: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
6d50: 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  e) then delete t
6d60: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
6d70: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6d80: 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
6d90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6da0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c  Expr *pExpr, Sel
6db0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
6dc0: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
6dd0: 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65    pExpr->x.pSele
6de0: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
6df0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
6e00: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
6e10: 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72  elect|EP_Subquer
6e20: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
6e30: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
6e40: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78  lags(pParse, pEx
6e50: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
6e60: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6e70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6e80: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
6e90: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
6ea0: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63  arse->db, pSelec
6eb0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
6ec0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
6ed0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
6ee0: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
6ef0: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
6f00: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
6f10: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
6f20: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
6f30: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
6f40: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6f50: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
6f60: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
6f70: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
6f80: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
6f90: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
6fa0: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
6fb0: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
6fc0: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
6fd0: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
6fe0: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
6ff0: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
7000: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
7010: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
7020: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
7030: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
7040: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
7050: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
7060: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
7070: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
7080: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
7090: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
70a0: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
70b0: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
70c0: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
70d0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
70e0: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
70f0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
7100: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
7110: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
7120: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
7130: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
7140: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
7150: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
7160: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
7170: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
7180: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
7190: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
71a0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
71b0: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
71c0: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
71d0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
71e0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
71f0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7200: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7210: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7220: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7230: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7240: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
7250: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
7260: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
7270: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
7280: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
7290: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
72a0: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
72b0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
72c0: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
72d0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
72e0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
72f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
7300: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
7310: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
7320: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
7330: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
7340: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
7350: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
7360: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
7370: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
7380: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
7390: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
73a0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
73b0: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
73c0: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
73d0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
73e0: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
73f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
7400: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
7410: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
7420: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
7430: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
7440: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
7450: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
7460: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
7470: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7480: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
7490: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
74a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
74b0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
74c0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
74d0: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
74e0: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
74f0: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
7500: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
7510: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
7520: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
7530: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
7540: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7550: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
7560: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
7570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
7580: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
7590: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
75a0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
75b0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
75c0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
75d0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
75e0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
75f0: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
7600: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
7610: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
7620: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
7630: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
7640: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7650: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
7660: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
7670: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7680: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
7690: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
76a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
76b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
76c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
76d0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
76e0: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
76f0: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
7700: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7710: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
7720: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
7730: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7740: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7750: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7760: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7770: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7780: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
7790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
77a0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
77b0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
77c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
77d0: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
77e0: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
77f0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
7800: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
7810: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
7820: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
7830: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7840: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7850: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
7860: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
7870: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7880: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
7890: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
78a0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
78b0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
78c0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
78d0: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
78e0: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
78f0: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
7900: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
7910: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
7920: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
7930: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
7940: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
7950: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
7960: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
7970: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
7980: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
7990: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
79a0: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
79b0: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
79c0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
79d0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
79e0: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
79f0: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
7a00: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
7a10: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
7a20: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
7a30: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
7a40: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7a50: 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e 29 7b   *pExpr, u32 n){
7a60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7a70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63   pParse->db;.  c
7a80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  onst char *z;.. 
7a90: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7aa0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
7ab0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
7ac0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
7ad0: 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64  Value|EP_Reduced
7ae0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
7af0: 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ;.  z = pExpr->u
7b00: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  .zToken;.  asser
7b10: 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( z!=0 );.  ass
7b20: 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ert( z[0]!=0 );.
7b30: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 73 71 6c    assert( n==sql
7b40: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
7b50: 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30  );.  if( z[1]==0
7b60: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
7b70: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7b80: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
7b90: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
7ba0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  umber */.    ass
7bb0: 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29  ert( z[0]=='?' )
7bc0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
7bd0: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
7be0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56    }else{.    ynV
7c00: 61 72 20 78 3b 0a 20 20 20 20 69 66 28 20 7a 5b  ar x;.    if( z[
7c10: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20  0]=='?' ){.     
7c20: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
7c30: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
7c40: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
7c50: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
7c60: 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69  d.      ** use i
7c70: 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c  t as the variabl
7c80: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
7c90: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69    i64 i;.      i
7ca0: 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69  nt bOk = 0==sqli
7cb0: 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c  te3Atoi64(&z[1],
7cc0: 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45   &i, n-1, SQLITE
7cd0: 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 78 20  _UTF8);.      x 
7ce0: 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20  = (ynVar)i;.    
7cf0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
7d00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7d10: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
7d20: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
7d30: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7d40: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7d50: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
7d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
7d70: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7d80: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7d90: 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20  _NUMBER] );.    
7da0: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20    if( bOk==0 || 
7db0: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
7dc0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
7dd0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
7de0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7df0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7e00: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
7e10: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
7e20: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
7e30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ",.            d
7e40: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7e50: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7e60: 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20  NUMBER]);.      
7e70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
7e80: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 70 50  }.      if( i>pP
7e90: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
7ea0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
7eb0: 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20  ar = (int)i;.   
7ec0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
7ed0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7ee0: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
7ef0: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
7f00: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
7f10: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
7f20: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
7f30: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
7f40: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
7f50: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
7f60: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
7f70: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
7f80: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
7f90: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
7fa0: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
7fb0: 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b 0a 20        ynVar i;. 
7fc0: 20 20 20 20 20 66 6f 72 28 69 3d 78 3d 30 3b 20       for(i=x=0; 
7fd0: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
7fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
7ff0: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
8000: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
8010: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
8020: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8030: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b 31    x = (ynVar)i+1
8040: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
8050: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8060: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
8070: 3d 3d 30 20 29 20 78 20 3d 20 28 79 6e 56 61 72  ==0 ) x = (ynVar
8080: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8090: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  );.    }.    pEx
80a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b  pr->iColumn = x;
80b0: 0a 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73  .    if( x>pPars
80c0: 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20  e->nzVar ){.    
80d0: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
80e0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
80f0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
8100: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
8110: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
8120: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8130: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
8140: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8150: 20 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74   /* Error report
8160: 65 64 20 74 68 72 6f 75 67 68 20 6d 61 6c 6c 6f  ed through mallo
8170: 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20  cFailed */.     
8180: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
8190: 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d   }.      pParse-
81a0: 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20  >azVar = a;.    
81b0: 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72    memset(&a[pPar
81c0: 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28  se->nzVar], 0, (
81d0: 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29  x-pParse->nzVar)
81e0: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
81f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
8200: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 7d 0a 20  Var = x;.    }. 
8210: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
8220: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
8230: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
8240: 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74  Var[x-1] = sqlit
8250: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
8260: 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  z, n);.    }.  }
8270: 20 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e   .  if( pParse->
8280: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
8290: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
82a0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
82b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
82c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
82d0: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
82e0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
82f0: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8300: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
8310: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
8320: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8330: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
8340: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
8350: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8360: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8370: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8380: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
8390: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
83a0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
83b0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
83c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
83d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83e0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
83f0: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8400: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
8410: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
8420: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8430: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
8440: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8450: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8470: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8480: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8490: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
84a0: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
84b0: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
84c0: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
84d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
84e0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
84f0: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8500: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8510: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8520: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8530: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8550: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8560: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8570: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8580: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8590: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
85a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
85b0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
85c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
85d0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
85e0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
85f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
8610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
8620: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
8630: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
8640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8650: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8660: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  lete(db, p->x.pL
8670: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
8680: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8690: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
86a0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
86b0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
86c0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45  Token);.  if( !E
86d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86e0: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
86f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8700: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
8710: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8720: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
8730: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
8740: 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33 45  if( p ) sqlite3E
8750: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8760: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
8770: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8780: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
8790: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
87a0: 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a  sion structure .
87b0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
87c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
87d0: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
87e0: 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c  one of EXPR_FULL
87f0: 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45  SIZE,.** EXPR_RE
8800: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
8810: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
8820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
8830: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8840: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
8850: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8860: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8870: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b   return EXPR_TOK
8880: 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66  ENONLYSIZE;.  if
8890: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
88a0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
88b0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52   ) return EXPR_R
88c0: 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65  EDUCEDSIZE;.  re
88d0: 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49  turn EXPR_FULLSI
88e0: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ZE;.}../*.** The
88f0: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
8900: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
8910: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8920: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
8930: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
8940: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
8950: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
8960: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
8970: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
8980: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
8990: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
89a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
89b0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
89c0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
89d0: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
89e0: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
89f0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
8a00: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
8a10: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
8a20: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
8a30: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
8a40: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
8a50: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
8a60: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
8a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
8ac0: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
8ad0: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
8ae0: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
8af0: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
8b00: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
8b10: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
8b20: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
8b30: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8b40: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
8b50: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
8b60: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
8b70: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
8b80: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
8b90: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
8ba0: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
8bb0: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
8bc0: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
8bd0: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
8be0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
8bf0: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
8c00: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
8c10: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
8c20: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
8c30: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
8c40: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
8c50: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
8c60: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
8c70: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
8c80: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
8c90: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
8ca0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
8cb0: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
8cc0: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
8cd0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
8ce0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
8cf0: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
8d00: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
8d10: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
8d20: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
8d30: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
8d40: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
8d50: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
8d60: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
8d70: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
8d80: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
8d90: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
8da0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
8db0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
8dc0: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
8dd0: 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45  r parts of teh E
8de0: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
8df0: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
8e00: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
8e10: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
8e20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8e30: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
8e40: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
8e50: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
8e60: 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52  .** make an EXPR
8e70: 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20  DUP_REDUCE copy 
8e80: 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70  of a reduced exp
8e90: 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20  ression.  It is 
8ea0: 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f  only legal.** to
8eb0: 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69   reduce a pristi
8ec0: 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ne expression tr
8ed0: 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ee from the pars
8ee0: 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  er.  The impleme
8ef0: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75  ntation.** of du
8f00: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8f10: 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74  e() contain mult
8f20: 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74  iple assert() st
8f30: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74  atements that at
8f40: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f  tempt.** to enfo
8f50: 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61  rce this constra
8f60: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
8f70: 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75  nt dupedExprStru
8f80: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  ctSize(Expr *p, 
8f90: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
8fa0: 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  t nSize;.  asser
8fb0: 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  t( flags==EXPRDU
8fc0: 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67  P_REDUCE || flag
8fd0: 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  s==0 ); /* Only 
8fe0: 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61  one flag value a
8ff0: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65  llowed */.  asse
9000: 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  rt( EXPR_FULLSIZ
9010: 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73  E<=0xfff );.  as
9020: 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28  sert( (0xfff & (
9030: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9040: 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a  kenOnly))==0 );.
9050: 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 29    if( 0==flags )
9060: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
9070: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d  PR_FULLSIZE;.  }
9080: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9090: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
90a0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
90b0: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
90c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
90d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
90e0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
90f0: 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ; .    assert( !
9100: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9110: 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20  p, EP_MemToken) 
9120: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9130: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9140: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20  p, EP_NoReduce) 
9150: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
9160: 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73  eft || p->x.pLis
9170: 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  t ){.      nSize
9180: 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53   = EXPR_REDUCEDS
9190: 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64  IZE | EP_Reduced
91a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
91b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
91c0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
91d0: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f   nSize = EXPR_TO
91e0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
91f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
9200: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9210: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
9220: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9230: 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69  urns the space i
9240: 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  n bytes required
9250: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
9260: 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78  py .** of the Ex
9270: 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  pr structure and
9280: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9290: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72  xpr.u.zToken str
92a0: 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20  ing (if that.** 
92b0: 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65  string is define
92c0: 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d.).*/.static in
92d0: 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  t dupedExprNodeS
92e0: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
92f0: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9300: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9310: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c  StructSize(p, fl
9320: 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20  ags) & 0xfff;.  
9330: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
9340: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
9350: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
9360: 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ken ){.    nByte
9370: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
9380: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
9390: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
93a0: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
93b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
93c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
93d0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
93e0: 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61  create a duplica
93f0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78  te of the .** ex
9400: 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20  pression passed 
9410: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9420: 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e  ument. The secon
9430: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a  d argument is a.
9440: 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69  ** mask containi
9450: 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  ng EXPRDUP_XXX f
9460: 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
9470: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
9480: 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f  ncludes space to
9490: 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
94a0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
94b0: 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20  t.** itself and 
94c0: 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72  the buffer refer
94d0: 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75  red to by Expr.u
94e0: 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e  .zToken, if any.
94f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
9500: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
9510: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
9520: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
9530: 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61  includes .** spa
9540: 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  ce to duplicate 
9550: 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69  all Expr nodes i
9560: 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65  n the tree forme
9570: 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20  d by Expr.pLeft 
9580: 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69  .** and Expr.pRi
9590: 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62  ght variables (b
95a0: 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73  ut not for any s
95b0: 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65  tructures pointe
95c0: 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63  d to or .** desc
95d0: 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45  ended from the E
95e0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45  xpr.x.pList or E
95f0: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61  xpr.x.pSelect va
9600: 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61  riables)..*/.sta
9610: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9620: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  rSize(Expr *p, i
9630: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
9640: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66   nByte = 0;.  if
9650: 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ( p ){.    nByte
9660: 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65   = dupedExprNode
9670: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
9680: 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58      if( flags&EX
9690: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a  PRDUP_REDUCE ){.
96a0: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64        nByte += d
96b0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
96c0: 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20  pLeft, flags) + 
96d0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
96e0: 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b  >pRight, flags);
96f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9700: 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a  urn nByte;.}../*
9710: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9720: 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
9730: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29  sqlite3ExprDup()
9740: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66  , except that if
9750: 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73   pzBuffer .** is
9760: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a   not NULL then *
9770: 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75  pzBuffer is assu
9780: 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  med to point to 
9790: 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65  a buffer large e
97a0: 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f  nough .** to sto
97b0: 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65  re the copy of e
97c0: 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65  xpression p, the
97d0: 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e   copies of p->u.
97e0: 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70  zToken.** (if ap
97f0: 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74  plicable), and t
9800: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  he copies of the
9810: 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d   p->pLeft and p-
9820: 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69  >pRight expressi
9830: 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20  ons,.** if any. 
9840: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
9850: 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73  , *pzBuffer is s
9860: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
9870: 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a  byte past the.**
9880: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
9890: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
98a0: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
98b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
98c0: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
98d0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
98e0: 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c  p, int dupFlags,
98f0: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
9900: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20  .  Expr *pNew;  
9910: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
9920: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
9930: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20   u8 *zAlloc;    
9940: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
9950: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63   space from whic
9960: 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20  h to build Expr 
9970: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20  object */.  u32 
9980: 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20  staticFlag;     
9990: 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69    /* EP_Static i
99a0: 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61  f space not obta
99b0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
99c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64   */..  assert( d
99d0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
99e0: 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( p );.  assert(
99f0: 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20   dupFlags==0 || 
9a00: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9a10: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73  P_REDUCE );.  as
9a20: 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d  sert( pzBuffer==
9a30: 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45  0 || dupFlags==E
9a40: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
9a50: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
9a60: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
9a70: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
9a80: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66  ructure. */.  if
9a90: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
9aa0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75    zAlloc = *pzBu
9ab0: 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63  ffer;.    static
9ac0: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
9ad0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9ae0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
9af0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
9b00: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9b10: 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20  , dupFlags));.  
9b20: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30    staticFlag = 0
9b30: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28  ;.  }.  pNew = (
9b40: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
9b50: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
9b60: 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a    /* Set nNewSiz
9b70: 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c  e to the size al
9b80: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
9b90: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
9ba0: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70  d to.    ** by p
9bb0: 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74  New. This is eit
9bc0: 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  her EXPR_FULLSIZ
9bd0: 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  E, EXPR_REDUCEDS
9be0: 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58  IZE or.    ** EX
9bf0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9c00: 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20  . nToken is set 
9c10: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9c20: 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a   bytes consumed.
9c30: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
9c40: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
9c50: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9c60: 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
9c70: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
9c80: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64   nStructSize = d
9c90: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
9ca0: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b  ze(p, dupFlags);
9cb0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
9cc0: 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63  NewSize = nStruc
9cd0: 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20  tSize & 0xfff;. 
9ce0: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20     int nToken;. 
9cf0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
9d00: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
9d10: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
9d20: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
9d30: 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  nToken = sqlite3
9d40: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
9d50: 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d  oken) + 1;.    }
9d60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  else{.      nTok
9d70: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
9d80: 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20 29    if( dupFlags )
9d90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9da0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9db0: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d  p, EP_Reduced)==
9dc0: 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 );.      memcp
9dd0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65  y(zAlloc, p, nNe
9de0: 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  wSize);.    }els
9df0: 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69  e{.      u32 nSi
9e00: 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53 74  ze = (u32)exprSt
9e10: 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20  ructSize(p);.   
9e20: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
9e30: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
9e40: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50     if( nSize<EXP
9e50: 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20  R_FULLSIZE ){ . 
9e60: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a         memset(&z
9e70: 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c  Alloc[nSize], 0,
9e80: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e   EXPR_FULLSIZE-n
9e90: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
9ea0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
9eb0: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
9ec0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
9ed0: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
9ee0: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
9ef0: 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66  . */.    pNew->f
9f00: 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64  lags &= ~(EP_Red
9f10: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9f20: 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d  y|EP_Static|EP_M
9f30: 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e  emToken);.    pN
9f40: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74  ew->flags |= nSt
9f50: 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52  ructSize & (EP_R
9f60: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9f70: 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nly);.    pNew->
9f80: 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46  flags |= staticF
9f90: 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  lag;..    /* Cop
9fa0: 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  y the p->u.zToke
9fb0: 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79  n string, if any
9fc0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f  . */.    if( nTo
9fd0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ken ){.      cha
9fe0: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
9ff0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
a000: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
a010: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  Size];.      mem
a020: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
a030: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
a040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
a050: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
a060: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45  New->flags) & (E
a070: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a080: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f  eaf)) ){.      /
a090: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
a0a0: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
a0b0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
a0c0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
a0d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a0e0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
a0f0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
a100: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a110: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
a120: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
a130: 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ect, dupFlags);.
a140: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a150: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
a160: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
a170: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
a180: 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73  .pList, dupFlags
a190: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a1a0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ..    /* Fill in
a1b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
a1c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
a1d0: 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
a1e0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a1f0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
a200: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
a210: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
a220: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
a230: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a240: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a250: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a260: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
a270: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  f) ){.        pN
a280: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a290: 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20  Left ?.         
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a2b0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
a2c0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a2d0: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a2e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a2f0: 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68  Right = p->pRigh
a300: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a310: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
a320: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
a330: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
a340: 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a  , &zAlloc) : 0;.
a350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a360: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
a370: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
a380: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
a390: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a3a0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a3b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
a3c0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a3e0: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
a3f0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
a400: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a410: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
a420: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a430: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
a440: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
a450: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
a460: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ft, 0);.        
a470: 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  }.        pNew->
a480: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
a490: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
a4a0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
a4b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
a4c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
a4d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20  *.** Create and 
a4e0: 72 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f  return a deep co
a4f0: 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  py of the object
a500: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
a510: 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65  econd .** argume
a520: 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f  nt. If an OOM co
a530: 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75  ndition is encou
a540: 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20  ntered, NULL is 
a550: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
a560: 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
a570: 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a  iled flag set..*
a580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
a590: 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63  _OMIT_CTE.static
a5a0: 20 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73   With *withDup(s
a5b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
a5c0: 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52   *p){.  With *pR
a5d0: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  et = 0;.  if( p 
a5e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
a5f0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
a600: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
a610: 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20  * (p->nCte-1);. 
a620: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
a630: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
a640: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
a650: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
a660: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65  int i;.      pRe
a670: 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74  t->nCte = p->nCt
a680: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
a690: 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
a6a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  ){.        pRet-
a6b0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
a6c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
a6d0: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65  (db, p->a[i].pSe
a6e0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
a6f0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f    pRet->a[i].pCo
a700: 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ls = sqlite3Expr
a710: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  ListDup(db, p->a
a720: 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20  [i].pCols, 0);. 
a730: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
a740: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
a750: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d  3DbStrDup(db, p-
a760: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
a770: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a780: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
a790: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
a7a0: 77 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23  withDup(x,y) 0.#
a7b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
a7c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
a7d0: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
a7e0: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
a7f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
a800: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a810: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
a820: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
a830: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
a840: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
a850: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
a860: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
a870: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
a880: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
a890: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
a8a0: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
a8b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
a8c0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
a8d0: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
a8e0: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
a8f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
a900: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
a910: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
a920: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
a930: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
a940: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
a950: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
a960: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
a970: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
a980: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
a990: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
a9a0: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
a9b0: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
a9c0: 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  plicated..**.** 
a9d0: 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  The flags parame
a9e0: 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ter contains a c
a9f0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
aa00: 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  e EXPRDUP_XXX fl
aa10: 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45  ags..** If the E
aa20: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
aa30: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
aa40: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
aa50: 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74  turned is a.** t
aa60: 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e  runcated version
aa70: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78   of the usual Ex
aa80: 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  pr structure tha
aa90: 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
aaa0: 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74   as.** part of t
aab0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
aac0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
aad0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
aae0: 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ma..*/.Expr *sql
aaf0: 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69  ite3ExprDup(sqli
ab00: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
ab10: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
ab20: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
ab30: 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44   || flags==EXPRD
ab40: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72  UP_REDUCE );.  r
ab50: 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75  eturn p ? exprDu
ab60: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
ab70: 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69  0) : 0;.}.ExprLi
ab80: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
ab90: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
aba0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c  db, ExprList *p,
abb0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45   int flags){.  E
abc0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
abd0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
abe0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
abf0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
ac00: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
ac10: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
ac20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ac30: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
ac40: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
ac50: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
ac60: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
ac70: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
ac80: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
ac90: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
aca0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
acb0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
acc0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
acd0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
ace0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = 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 20 69 2a 73 69 7a 65 6f 66 28 70  (db,  i*sizeof(p
ad10: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
ad20: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
ad30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ad40: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
ad50: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
ad60: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
ad70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ad80: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
ad90: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
ada0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64  {.    Expr *pOld
adb0: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
adc0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  >pExpr;.    pIte
add0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
ade0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
adf0: 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a  ldExpr, flags);.
ae00: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
ae10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
ae20: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ae30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
ae40: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
ae50: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ae60: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  pOldItem->zSpan)
ae70: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
ae80: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
ae90: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
aea0: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
aeb0: 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  0;.    pItem->bS
aec0: 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49  panIsTab = pOldI
aed0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b  tem->bSpanIsTab;
aee0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20  .    pItem->u = 
aef0: 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d  pOldItem->u;.  }
af00: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
af10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
af20: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
af30: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
af40: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
af50: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
af60: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
af70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
af80: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
af90: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
afa0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
afb0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
afc0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
afd0: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
afe0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
aff0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
b000: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b010: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
b020: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
b030: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
b040: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
b050: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b060: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
b070: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
b080: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
b090: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
b0a0: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
b0b0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b0c0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61    int nByte;.  a
b0d0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b0e0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b0f0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
b100: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
b110: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
b120: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
b130: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
b140: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b150: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b160: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
b170: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
b180: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
b190: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
b1a0: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
b1b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
b1c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
b1d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
b1e0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
b1f0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
b200: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b210: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
b220: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
b230: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
b240: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
b250: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
b260: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b270: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
b280: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b290: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
b2a0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
b2b0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
b2c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b2d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
b2e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b2f0: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
b300: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b310: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
b320: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67      pNewItem->fg
b330: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b   = pOldItem->fg;
b340: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
b350: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
b360: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
b370: 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69  pNewItem->addrFi
b380: 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d  llSub = pOldItem
b390: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20  ->addrFillSub;. 
b3a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67     pNewItem->reg
b3b0: 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65  Return = pOldIte
b3c0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
b3d0: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
b3e0: 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
b3f0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
b400: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
b410: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b420: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b430: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
b440: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
b450: 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  em->pIBIndex = p
b460: 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  OldItem->pIBInde
b470: 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  x;.    if( pNewI
b480: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
b490: 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  c ){.      pNewI
b4a0: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
b4b0: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
b4c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
b4d0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
b4e0: 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67  1.pFuncArg, flag
b4f0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  s);.    }.    pT
b500: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
b510: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
b520: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
b530: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
b540: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
b550: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b560: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b570: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
b580: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
b590: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
b5a0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
b5b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b5c0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
b5d0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
b5e0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
b5f0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
b600: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
b610: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
b620: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
b630: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
b640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b650: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
b660: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
b670: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
b680: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
b690: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b6a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b6b0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b6c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b6d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b6e0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b6f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
b700: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b710: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b720: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
b730: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
b740: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b750: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
b760: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
b770: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
b780: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b790: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
b7a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b7b0: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65   /* Note that be
b7c0: 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f  cause the size o
b7d0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
b7e0: 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e   for p->a[] is n
b7f0: 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72  ot.  ** necessar
b800: 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ily a power of t
b810: 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73  wo, sqlite3IdLis
b820: 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f  tAppend() may no
b830: 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  t be called.  **
b840: 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74   on the duplicat
b850: 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  e created by thi
b860: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
b870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b880: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
b890: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
b8a0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
b8b0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
b8c0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
b8d0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b8e0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
b8f0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b900: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b910: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b920: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b930: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
b940: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
b950: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
b960: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
b970: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b980: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
b990: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
b9a0: 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b   *pNew, *pPrior;
b9b0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b9c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b9d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b9e0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
b9f0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
ba00: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
ba10: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
ba20: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
ba30: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
ba40: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
ba50: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
ba60: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
ba70: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
ba80: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
ba90: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
baa0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
bab0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
bac0: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
bad0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
bae0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
baf0: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
bb00: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
bb10: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
bb20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bb30: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
bb40: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
bb50: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
bb60: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
bb70: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
bb80: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
bb90: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
bba0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
bbb0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
bbc0: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
bbd0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
bbe0: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
bbf0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
bc00: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
bc10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
bc20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bc30: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
bc40: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bc50: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
bc60: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
bc70: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
bc80: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
bc90: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
bca0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
bcb0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
bcc0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
bcd0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
bce0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
bcf0: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
bd00: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
bd10: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
bd20: 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  w->nSelectRow = 
bd30: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  p->nSelectRow;. 
bd40: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
bd50: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
bd60: 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ith);.  sqlite3S
bd70: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
bd80: 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  w, p->zSelName);
bd90: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bda0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
bdb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bdc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
bdd0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
bde0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
bdf0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
be00: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
be10: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
be20: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
be30: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
be40: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
be50: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
be60: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
be70: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
be80: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
be90: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
bea0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
beb0: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
bec0: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
bed0: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
bee0: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
bef0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
bf00: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
bf10: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
bf20: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
bf30: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
bf40: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
bf50: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
bf60: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
bf70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bf80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
bf90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
bfa0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
bfb0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
bfc0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
bfd0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
bfe0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
bff0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
c000: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
c010: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
c020: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
c030: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c040: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c050: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c060: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c070: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c080: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c090: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c0a0: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c0b0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c0c0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c0e0: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ->nExpr = 0;.   
c0f0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
c100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c110: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  (db, sizeof(pLis
c120: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
c130: 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29  f( pList->a==0 )
c140: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
c150: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
c160: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
c170: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
c180: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
c190: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
c1a0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
c1b0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
c1c0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
c1d0: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
c1e0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  >a, pList->nExpr
c1f0: 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  *2*sizeof(pList-
c200: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
c210: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
c220: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c230: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
c240: 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   a;.  }.  assert
c250: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
c260: 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20  .  if( 1 ){.    
c270: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c280: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
c290: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
c2a0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
c2b0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
c2c0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
c2d0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
c2e0: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
c2f0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
c300: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
c310: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
c320: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
c330: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
c340: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c350: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
c360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c370: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
c380: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c390: 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20  ./*.** pColumns 
c3a0: 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61  and pExpr form a
c3b0: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
c3c0: 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74  nt which is part
c3d0: 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63   of the SET.** c
c3e0: 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41  lause of an UPDA
c3f0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c  TE statement.  L
c400: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
c410: 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d         (a,b,c) =
c420: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
c430: 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28  pr3).** Or:    (
c440: 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54  a,b,c) = (SELECT
c450: 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e   x,y,z FROM ....
c460: 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ).**.** For each
c470: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63   term of the vec
c480: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20  tor assignment, 
c490: 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69  append new entri
c4a0: 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70  es to the.** exp
c4b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69  ression list pLi
c4c0: 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65  st.  In the case
c4d0: 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f   of a subquery o
c4e0: 6e 20 74 68 65 20 4c 48 53 2c 20 61 70 70 65 6e  n the LHS, appen
c4f0: 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43  d.** TK_SELECT_C
c500: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
c510: 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  s..*/.ExprList *
c520: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c530: 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50  ppendVector(.  P
c540: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c550: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c560: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c570: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
c580: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
c590: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
c5a0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c5b0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
c5c0: 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69  umns,      /* Li
c5d0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c  st of names of L
c5e0: 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e  HS of the assign
c5f0: 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
c600: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
c610: 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65   /* Vector expre
c620: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
c630: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
c640: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
c650: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c660: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  ->db;.  int n;. 
c670: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46   int i;.  int iF
c680: 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  irst = pList ? p
c690: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
c6a0: 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63  .  /* pColumns c
c6b0: 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20  an only be NULL 
c6c0: 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75  due to an OOM bu
c6d0: 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  t an OOM will ca
c6e0: 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74  use an.  ** exit
c6f0: 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
c700: 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76  outine being inv
c710: 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45  oked */.  if( NE
c720: 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29  VER(pColumns==0)
c730: 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61   ) goto vector_a
c740: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69  ppend_error;.  i
c750: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f  f( pExpr==0 ) go
c760: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
c770: 5f 65 72 72 6f 72 3b 0a 20 20 6e 20 3d 20 73 71  _error;.  n = sq
c780: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
c790: 69 7a 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ize(pExpr);.  if
c7a0: 28 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21  ( pColumns->nId!
c7b0: 3d 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =n ){.    sqlite
c7c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c7d0: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
c7e0: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
c7f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c800: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
c810: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
c820: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
c830: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f  _error;.  }.  fo
c840: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
c850: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75 62  {.    Expr *pSub
c860: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
c870: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
c880: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
c890: 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  i);.    pList = 
c8a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c8b0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
c8c0: 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a  ist, pSubExpr);.
c8d0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
c8e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c8f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69  List->nExpr==iFi
c900: 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20  rst+i+1 );.     
c910: 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
c920: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
c930: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d  = pColumns->a[i]
c940: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  .zName;.      pC
c950: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
c960: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
c970: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
c980: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
c990: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 26      if( pList &&
c9a0: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
c9b0: 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ].pExpr ){.     
c9c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
c9d0: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 2d  a[iFirst].pExpr-
c9e0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
c9f0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70  OLUMN );.      p
ca00: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
ca10: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
ca20: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 78  pExpr;.      pEx
ca30: 70 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pr = 0;.    }.  
ca40: 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  }..vector_append
ca50: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
ca60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ca70: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
ca80: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
ca90: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
caa0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
cab0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
cac0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
cad0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
cae0: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
caf0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
cb00: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
cb10: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
cb20: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
cb30: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
cb40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
cb50: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
cb60: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
cb70: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
cb80: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
cb90: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
cba0: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
cbb0: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
cbc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
cbd0: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
cbe0: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
cbf0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
cc00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
cc10: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
cc20: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
cc30: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
cc40: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
cc50: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
cc60: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
cc70: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
cc80: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
cc90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
cca0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
ccb0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
ccc0: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
ccd0: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
cce0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
ccf0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
cd00: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
cd10: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
cd20: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
cd30: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
cd40: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
cd50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
cd60: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
cd70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
cd80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cd90: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
cda0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
cdb0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
cdc0: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
cdd0: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
cde0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
cdf0: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
ce00: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
ce10: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
ce20: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
ce30: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
ce40: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
ce50: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
ce60: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
ce70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
ce80: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
ce90: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
cea0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
ceb0: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
cec0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
ced0: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
cee0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
cef0: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
cf00: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
cf10: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
cf20: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
cf30: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
cf40: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
cf50: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
cf60: 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73   if( dequote ) s
cf70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
cf80: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
cf90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
cfa0: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
cfb0: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
cfc0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
cfd0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
cfe0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
cff0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
d000: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
d010: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
d020: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
d030: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
d040: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
d050: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
d060: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
d070: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
d080: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
d090: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
d0a0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d0b0: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
d0c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d0d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d0e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d0f0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d100: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
d110: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
d120: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
d130: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
d140: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
d150: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
d160: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d170: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
d180: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
d190: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d1a0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
d1b0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
d1c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d1d0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
d1e0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
d1f0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
d200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
d210: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d220: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d230: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
d240: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
d250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
d260: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
d270: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
d280: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
d290: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
d2a0: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
d2b0: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
d2e0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
d2f0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
d300: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
d310: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d320: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
d330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
d340: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
d350: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
d360: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
d370: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d380: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
d390: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
d3a0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
d3b0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
d3c0: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
d3d0: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
d3e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
d3f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
d400: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
d410: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
d420: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
d430: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
d440: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d450: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
d460: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
d470: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
d480: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d490: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d4a0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
d4b0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
d4c0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
d4d0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
d4e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d4f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
d500: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
d510: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
d520: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
d530: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
d540: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
d550: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d560: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
d570: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
d580: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
d590: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
d5a0: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
d5b0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d5c0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
d5d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d5e0: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
d5f0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
d600: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d610: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
d620: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d630: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
d640: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d650: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
d660: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
d670: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
d680: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
d690: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
d6a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
d6b0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d6c0: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
d6d0: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
d6e0: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
d6f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
d700: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
d710: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
d720: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
d730: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
d740: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
d750: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
d760: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
d770: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
d780: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
d790: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
d7a0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d7b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
d7c0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
d7d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
d7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d7f0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
d800: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
d810: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
d820: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
d830: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
d840: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
d850: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
d860: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
d870: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
d880: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
d890: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
d8a0: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
d8b0: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
d8c0: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
d8d0: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
d8e0: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
d8f0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
d900: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
d910: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
d920: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
d930: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
d940: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
d950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
d960: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
d980: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
d990: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
d9a0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
d9b0: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
d9c0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
d9d0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
d9e0: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
d9f0: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
da00: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
da10: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
da20: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
da30: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
da40: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
da50: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
da60: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
da70: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
da80: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
da90: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
daa0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
dab0: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
dac0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
dad0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
dae0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
daf0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
db00: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
db10: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
db20: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
db30: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
db40: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
db50: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
db60: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
db70: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
db80: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
db90: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
dba0: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
dbb0: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
dbc0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
dbd0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
dbe0: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
dbf0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
dc00: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
dc10: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
dc20: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
dc30: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
dc40: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
dc50: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
dc60: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
dc70: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
dc80: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
dc90: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
dca0: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
dcb0: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
dcc0: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
dcd0: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
dce0: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
dcf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
dd00: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
dd10: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
dd20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
dd30: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
dd40: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
dd50: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
dd60: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
dd70: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
dd80: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
dd90: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
dda0: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
ddb0: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
ddc0: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
ddd0: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
dde0: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
ddf0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
de00: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
de10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
de20: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
de30: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
de40: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
de50: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
de60: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
de70: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
de80: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
de90: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
dea0: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
deb0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
dec0: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
ded0: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
dee0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
def0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
df00: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
df10: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
df20: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
df30: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
df40: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
df50: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
df60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
df70: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
df90: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
dfa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dfb0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
dfc0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
dfd0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
dfe0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
dff0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
e000: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
e010: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
e020: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
e030: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
e040: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e050: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
e060: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
e070: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e080: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
e090: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e0a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
e0b0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
e0c0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e0d0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
e0e0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
e0f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e100: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
e110: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
e120: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
e130: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
e140: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
e150: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
e160: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e170: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
e180: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
e190: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
e1a0: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
e1b0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e1c0: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
e1d0: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
e1e0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
e1f0: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
e200: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
e210: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
e220: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
e230: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
e240: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
e250: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
e260: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
e270: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e280: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
e290: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
e2a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e2b0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e2c0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
e2d0: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
e2e0: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
e2f0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
e300: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
e310: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
e320: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
e330: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
e340: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e350: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
e360: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
e370: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
e380: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
e390: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
e3a0: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
e3b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e3c0: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
e3d0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e3e0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
e3f0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
e400: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e410: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
e420: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
e430: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
e440: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
e450: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
e460: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
e470: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
e480: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
e490: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
e4a0: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
e4b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
e4c0: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
e4d0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
e4e0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e4f0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
e500: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
e510: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
e520: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
e530: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
e540: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
e550: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
e560: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
e570: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
e580: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
e590: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
e5a0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
e5b0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
e5c0: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
e5d0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
e5e0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
e5f0: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
e600: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
e610: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
e620: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
e630: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e640: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
e650: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
e660: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
e670: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
e680: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
e690: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
e6a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
e6b0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
e6c0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
e6d0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
e6e0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
e6f0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
e700: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
e710: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
e720: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
e730: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e740: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
e750: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e760: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
e770: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
e780: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
e790: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
e7a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e7b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
e7c0: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
e7d0: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
e7e0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
e7f0: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
e800: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
e810: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
e820: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
e830: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
e840: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
e850: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
e860: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
e870: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
e880: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
e890: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
e8a0: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
e8b0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
e8c0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
e8d0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
e8e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e8f0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
e900: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
e910: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
e920: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
e930: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
e940: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
e950: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
e960: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
e970: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
e980: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
e990: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
e9a0: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
e9b0: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
e9c0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
e9d0: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
e9e0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e9f0: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f  , 3, iCur);.}../
ea00: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
ea10: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
ea20: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
ea30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ea40: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
ea50: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
ea60: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
ea70: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
ea80: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
ea90: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
eaa0: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
eab0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
eac0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
ead0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
eae0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
eaf0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
eb00: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
eb10: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
eb20: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
eb30: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
eb40: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
eb50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
eb60: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
eb70: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
eb80: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
eb90: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
eba0: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
ebb0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
ebc0: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
ebd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ebe0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
ebf0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  INTS./*.** Walk 
ec00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
ec10: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
ec20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ec30: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75  contains a.** su
ec40: 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b  bquery of some k
ec50: 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ind.  Return 0 i
ec60: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73  f there are no s
ec70: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e  ubqueries..*/.in
ec80: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e  t sqlite3ExprCon
ec90: 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78  tainsSubquery(Ex
eca0: 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  pr *p){.  Walker
ecb0: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
ecc0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
ecd0: 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
ece0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
ecf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
ed00: 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
ed10: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
ed20: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
ed30: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
ed40: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
ed50: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
ed60: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
ed70: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
ed80: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
ed90: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
eda0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
edb0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
edc0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
edd0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
ede0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
edf0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
ee00: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
ee10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ee20: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
ee30: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
ee40: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
ee50: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
ee60: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
ee70: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
ee80: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
ee90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
eea0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
eeb0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
eec0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
eed0: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
eee0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
eef0: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
ef00: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
ef10: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
ef20: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
ef30: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
ef40: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
ef50: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
ef60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
ef70: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
ef80: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
ef90: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
efa0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
efb0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
efc0: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
efd0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
efe0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
eff0: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
f000: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
f010: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f020: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
f030: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
f040: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
f050: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
f060: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
f070: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
f080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f090: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
f0a0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
f0b0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
f0c0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
f0d0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
f0e0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f0f0: 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
f100: 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
f110: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
f120: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
f130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f140: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
f150: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
f160: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f170: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
f180: 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
f190: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
f1a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
f1b0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
f1c0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
f1d0: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
f1e0: 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
f1f0: 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
f200: 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
f210: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
f220: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f230: 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
f240: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
f250: 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
f260: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
f270: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
f280: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
f290: 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
f2a0: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
f2b0: 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
f2c0: 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
f2d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
f2e0: 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
f2f0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
f300: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
f310: 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
f320: 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
f330: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
f340: 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
f350: 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
f360: 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
f370: 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
f380: 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
f390: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
f3a0: 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
f3b0: 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
f3c0: 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
f3d0: 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
f3e0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
f3f0: 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
f400: 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
f410: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
f420: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
f430: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
f440: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
f450: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
f460: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
f470: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
f480: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
f490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
f4a0: 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
f4b0: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
f4c0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
f4d0: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
f4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f4f0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
f500: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
f510: 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20   p->pTab!=0 );. 
f520: 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
f530: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
f540: 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
f560: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
f570: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
f580: 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
f590: 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
f5a0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
f5b0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
f5c0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
f5d0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
f5e0: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
f5f0: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
f600: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
f610: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
f620: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
f630: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
f640: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
f650: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f660: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
f670: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
f680: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
f690: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
f6a0: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
f6b0: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
f6c0: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
f6d0: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
f6e0: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
f6f0: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
f700: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
f710: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
f720: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
f730: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
f740: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
f750: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
f760: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
f770: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
f780: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
f790: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
f7a0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
f7b0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
f7c0: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
f7d0: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
f7e0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
f7f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
f800: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
f810: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f820: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
f830: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
f840: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
f850: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
f860: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
f870: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
f880: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
f890: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
f8a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
f8b0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
f8c0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
f8d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
f8e0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
f8f0: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
f900: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
f910: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
f920: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
f930: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
f940: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
f950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f960: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
f970: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
f980: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
f990: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
f9a0: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
f9b0: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
f9c0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
f9d0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
f9e0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f9f0: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
fa00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
fa10: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fa20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
fa30: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
fa40: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
fa50: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
fa60: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
fa70: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
fa80: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
fa90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
faa0: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
fab0: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
fac0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
fad0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
fae0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
faf0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
fb00: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
fb10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
fb20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
fb30: 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
fb40: 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
fb50: 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
fb60: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
fb70: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
fb80: 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
fb90: 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
fba0: 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
fbb0: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
fbc0: 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
fbd0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
fbe0: 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
fbf0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
fc00: 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
fc10: 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
fc20: 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
fc30: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
fc40: 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
fc50: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
fc60: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
fc70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
fc80: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
fc90: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
fca0: 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
fcb0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
fcc0: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
fcd0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
fce0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
fcf0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
fd00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
fd10: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
fd20: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
fd30: 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
fd40: 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
fd50: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
fd60: 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
fd70: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
fd80: 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
fd90: 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
fda0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
fdb0: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fdd0: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
fde0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
fdf0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
fe00: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
fe10: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
fe20: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
fe30: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fe40: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fe50: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
fe60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fe70: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
fe80: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
fe90: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
fea0: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
feb0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
fec0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
fed0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
fee0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
fef0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
ff00: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff20: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
ff30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
ff40: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
ff50: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
ff60: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
ff70: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
ff80: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
ff90: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
ffa0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
ffb0: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
ffc0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
ffd0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fff0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
10000 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
10010 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
10020 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
10030 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
10040 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
10050 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
10060 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
10070 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
10080 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
10090 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
100a0 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
100b0 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
100c0 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
100d0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
100e0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
100f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10100 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
10110 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
10120 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
10130 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
10140 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
10150 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
10160 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
10170 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
10180 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
10190 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
101a0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  st;.  assert( pE
101b0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  List!=0 );.  /* 
101c0 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c  All SELECT resul
101d0 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d  ts must be colum
101e0 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ns. */.  for(i=0
101f0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
10200 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
10210 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74  r *pRes = pEList
10220 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10230 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d    if( pRes->op!=
10240 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
10250 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74  rn 0;.    assert
10260 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d  ( pRes->iTable==
10270 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
10280 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  or );  /* Not a 
10290 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
102a0 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ery */.  }.  ret
102b0 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn p;.}.#endif 
102c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
102d0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
102e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
102f0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
10300 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
10310 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
10320 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
10330 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
10340 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
10350 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
10360 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
10370 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
10380 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
10390 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
103a0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
103b0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
103c0 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
103d0 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
103e0 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
103f0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
10400 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
10410 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
10420 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
10430 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
10440 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
10450 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
10460 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
10470 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c  int addr1;.  sql
10480 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10490 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
104a0 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
104b0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
104c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
104d0 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56  Rewind, iCur); V
104e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
104f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10500 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
10510 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61  , iCur, 0, regHa
10520 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  sNull);.  sqlite
10530 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
10540 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
10550 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  G);.  VdbeCommen
10560 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74  t((v, "first_ent
10570 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72  ry_in(%d)", iCur
10580 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
10590 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
105a0 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  r1);.}.#endif...
105b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
105c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
105d0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
105e0 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
105f0 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
10600 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
10610 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
10620 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
10630 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
10640 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
10650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10660 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
10670 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
10680 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
10690 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
106a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
106b0 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
106c0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
106d0 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
106e0 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
106f0 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
10700 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
10710 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
10720 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
10730 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
10740 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
10750 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
10760 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
10770 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
10780 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
10790 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
107a0 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
107b0 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
107c0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
107d0 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
107e0 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
107f0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
10800 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
10810 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
10820 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
10830 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
10840 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
10850 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
10860 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
10870 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
10880 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
10890 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
108a0 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
108b0 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
108c0 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
108d0 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
108e0 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
108f0 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
10900 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
10910 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
10920 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
10930 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
10940 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
10950 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
10960 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
10970 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
10980 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
10990 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
109a0 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
109b0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
109c0 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
109d0 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
109e0 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
109f0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
10a00 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
10a10 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
10a20 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10a30 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
10a40 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
10a50 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
10a60 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
10a70 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10a80 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
10a90 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
10aa0 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
10ab0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10ac0 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
10ad0 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
10ae0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10af0 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
10b00 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
10b10 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
10b20 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
10b30 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
10b40 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
10b50 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
10b60 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
10b80 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
10b90 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
10ba0 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
10bb0 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
10bc0 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
10bd0 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
10be0 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
10bf0 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
10c00 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
10c10 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
10c20 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e  1>, <column2>...
10c30 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
10c40 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
10c50 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
10c60 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
10c70 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
10c80 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
10c90 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
10ca0 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
10cb0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
10cc0 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
10cd0 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
10ce0 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
10cf0 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
10d00 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
10d10 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
10d20 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
10d30 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
10d40 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
10d50 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   exactly one of 
10d60 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
10d70 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
10d80 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
10d90 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
10da0 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
10db0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
10dc0 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
10dd0 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
10de0 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61  used for a.** fa
10df0 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  st membership te
10e00 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
10e10 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
10e20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49  is set, the.** I
10e30 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  N index will be 
10e40 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
10e50 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
10e60 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a  the RHS of the.*
10e70 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  * IN operator..*
10e80 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
10e90 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20  EX_LOOP is used 
10ea0 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
10eb0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
10ec0 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
10ed0 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
10ee0 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74  rs) then the b-t
10ef0 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e  ree must not con
10f00 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e  tain duplicates.
10f10 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c  .** An epheremal
10f20 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
10f30 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
10f40 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
10f50 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
10f60 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
10f70 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
10f80 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
10f90 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
10fa0 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
10fb0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
10fc0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
10fd0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
10fe0 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
10ff0 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
11000 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
11010 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
11020 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
11030 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
11040 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
11050 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
11060 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
11070 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
11080 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
11090 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
110a0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
110b0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
110c0 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
110d0 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
110e0 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
110f0 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
11100 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
11110 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
11120 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
11130 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
11140 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
11150 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
11160 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
11170 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
11180 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
11190 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
111a0 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
111b0 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
111c0 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
111d0 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
111e0 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
111f0 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
11200 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
11210 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
11220 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
11230 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
11240 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
11250 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
11260 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
11270 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
11280 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
11290 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
112a0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
112b0 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
112c0 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
112d0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
112e0 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
112f0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
11300 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
11310 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
11320 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
11330 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
11340 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
11350 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
11360 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
11370 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
11380 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
11390 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
113a0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
113b0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
113c0 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
113d0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
113e0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
113f0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
11400 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
11410 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
11420 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
11430 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
11440 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
11450 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
11460 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
11470 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
11480 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
11490 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
114a0 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
114b0 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
114c0 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
114d0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
114e0 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
114f0 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
11500 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
11510 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
11520 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
11530 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
11540 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
11550 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
11560 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
11570 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
11580 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
11590 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
115a0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
115b0 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
115c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
115d0 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
115e0 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
115f0 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
11600 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
11610 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
11620 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
11630 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
11640 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
11650 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
11660 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
11670 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
11680 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
11690 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
116a0 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
116b0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
116c0 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
116d0 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
116e0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
116f0 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
11700 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
11710 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
11720 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
11730 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
11740 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11750 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
11760 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
11770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11790 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
117a0 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117c0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
117d0 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
117e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
117f0 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11810 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
11820 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
11830 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
11840 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
11850 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
11860 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11870 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
11880 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
11890 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20   *aiMap         
118a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
118b0 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
118c0 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
118d0 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ds */.){.  Selec
118e0 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
11910 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
11920 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
11930 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
11960 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
11970 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
11980 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11990 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
119a0 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
119b0 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
119c0 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
119f0 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
11a00 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
11a10 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
11a20 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
11a30 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
11a40 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
11a50 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
11a60 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
11a70 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
11a80 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
11a90 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
11aa0 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
11ab0 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
11ac0 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
11ad0 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
11ae0 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
11af0 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
11b00 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
11b10 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
11b20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
11b30 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
11b40 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
11b50 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
11b60 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
11b70 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
11b80 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
11b90 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
11ba0 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
11bb0 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
11bc0 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
11bd0 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
11be0 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
11bf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
11c00 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
11c10 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
11c20 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
11c30 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
11c40 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
11c50 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
11c60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11c70 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
11c80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
11c90 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
11ca0 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
11cb0 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
11cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11cd0 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
11ce0 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
11cf0 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
11d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
11d10 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
11d20 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
11d30 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
11d40 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
11d50 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
11d60 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
11d70 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
11d80 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
11d90 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
11da0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11db0 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
11dc0 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
11dd0 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
11de0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11df0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
11e00 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11e10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11e20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
11e30 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e50 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
11e60 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e90 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
11ea0 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
11eb0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
11ec0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
11ed0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
11ee0 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
11ef0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11f00 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
11f10 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11f20 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f30 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f40 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11f50 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
11f60 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
11f70 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11f80 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11f90 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
11fa0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11fb0 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
11fc0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
11fd0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
11fe0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
11ff0 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
12000 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
12010 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
12020 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
12030 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
12040 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12050 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12060 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12070 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12080 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12090 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
120a0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
120b0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
120c0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
120d0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65  Name);..    asse
120e0 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74  rt(v);  /* sqlit
120f0 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20  e3GetVdbe() has 
12100 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76  always been prev
12110 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f  iously called */
12120 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d  .    if( nExpr==
12130 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
12140 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
12150 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  <0 ){.      /* T
12160 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  he "x IN (SELECT
12170 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c   rowid FROM tabl
12180 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  e)" case */.    
12190 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
121a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
121b0 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20  v, OP_Once);.   
121c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
121d0 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
121e0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
121f0 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
12200 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
12210 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
12220 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
12230 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
12240 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
12250 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
12260 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
12270 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12290 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
122a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
122b0 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a  ffinity_ok = 1;.
122c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
122d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
122e0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
122f0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
12300 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68   to perform each
12310 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
12320 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
12330 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
12340 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
12350 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20   in table.      
12360 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ** on the RHS of
12370 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12380 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74  .  If it not, it
12390 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
123a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   to.      ** use
123b0 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68   any index of th
123c0 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f  e RHS table.  */
123d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
123e0 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e  i<nExpr && affin
123f0 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20  ity_ok; i++){.  
12400 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
12410 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
12420 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
12430 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
12440 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
12450 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
12460 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
12470 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
12480 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
12490 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61  lumnAffinity(pTa
124a0 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20  b,iCol); /* RHS 
124b0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
124c0 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73   char cmpaff = s
124d0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
124e0 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61  inity(pLhs, idxa
124f0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ff);.        tes
12500 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
12510 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
12520 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
12530 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
12540 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
12550 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63         switch( c
12560 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  mpaff ){.       
12570 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
12580 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20  FF_BLOB:.       
12590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
125a0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
125b0 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
125c0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
125d0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
125e0 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73  y() only returns
125f0 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64   TEXT if one sid
12600 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20  e or the.       
12610 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61       ** other ha
12620 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e  s no affinity an
12630 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  d the other side
12640 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65   is TEXT.  Hence
12650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ,.            **
12660 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f   the only way fo
12670 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54  r cmpaff to be T
12680 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66  EXT is for idxaf
12690 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20  f to be TEXT.   
126a0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
126b0 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20  for the term on 
126c0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
126d0 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66  N to have no aff
126e0 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  inity. */.      
126f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
12700 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
12710 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
12720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12730 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
12740 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e             affin
12750 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
12760 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
12770 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  y(idxaff);.     
12780 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
12790 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
127a0 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _ok ){.        /
127b0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
127c0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74  existing index t
127d0 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f  hat will work fo
127e0 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
127f0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  or */.        fo
12800 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
12810 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
12820 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78  pe==0; pIdx=pIdx
12830 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
12840 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55      Bitmask colU
12850 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c  sed;      /* Col
12860 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
12870 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  x used */.      
12880 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c      Bitmask mCol
12890 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
128a0 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  k for the curren
128b0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  t column */.    
128c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
128d0 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20  nColumn<nExpr ) 
128e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
128f0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
12900 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
12910 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
12920 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
12930 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
12940 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
12950 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
12960 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
12970 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
12980 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
12990 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
129a0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
129b0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
129c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
129d0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
129e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
129f0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
12a00 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
12a10 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12a20 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
12a30 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
12a40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
12a50 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
12a60 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
12a70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12a80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
12a90 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
12aa0 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
12ab0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
12ac0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
12ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ae0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
12af0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
12b00 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
12b10 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
12b20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
12b30 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
12b40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
12b50 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
12b60 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
12b70 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
12b80 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
12b90 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
12ba0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
12bb0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
12bc0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
12bd0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
12be0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
12bf0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
12c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
12c10 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
12c20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
12c30 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
12c40 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
12c50 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
12c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
12c70 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
12c80 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
12c90 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
12ca0 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
12cb0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
12cc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
12cd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
12ce0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12d00 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
12d10 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
12d20 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
12d30 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
12d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12d80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12d90 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
12da0 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
12db0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
12dc0 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
12dd0 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
12de0 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
12df0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
12e00 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
12e10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
12e20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
12e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12e40 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
12e50 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
12e60 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
12e70 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
12e80 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
12e90 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
12ea0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
12eb0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
12ec0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
12ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
12ee0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
12ef0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
12f00 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
12f10 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
12f20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
12f30 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
12f40 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
12f50 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
12f60 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53  ge(v);.#ifndef S
12f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12f80 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  IN.            s
12f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12fa0 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
12fb0 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  0, 0, 0,.       
12fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
12fd0 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47  rintf(db, "USING
12fe0 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e   INDEX %s FOR IN
12ff0 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d  -OPERATOR",pIdx-
13000 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
13010 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
13020 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
13030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13040 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
13050 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
13060 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
13070 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13080 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
13090 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
130a0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
130b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
130c0 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
130d0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
130e0 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
130f0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
13100 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
13110 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
13120 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13130 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
13140 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
13150 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
13160 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
13170 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20  sNull ){.#ifdef 
13180 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
13190 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
131b0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
131c0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
131d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
131e0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
131f0 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
13220 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
13230 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
13240 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
13250 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
13260 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
13270 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
13280 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
13290 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
132a0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
132b0 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
132c0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
132d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
132e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
132f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13300 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
13310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13320 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
13330 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
13340 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
13350 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
13360 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
13370 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
13380 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
13390 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
133a0 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
133b0 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
133c0 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
133d0 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
133e0 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
133f0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
13400 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
13410 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
13420 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
13430 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13440 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
13450 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
13460 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
13470 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
13480 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
13490 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
134a0 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
134b0 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
134c0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
134d0 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
134e0 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
134f0 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
13500 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
13510 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
13520 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
13530 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
13540 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
13550 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
13560 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
13570 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
13580 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
13590 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
135a0 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
135b0 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
135c0 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
135d0 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
135e0 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
135f0 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
13600 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
13610 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
13620 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
13630 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
13640 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
13650 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
13660 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
13670 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
13680 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
13690 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
136a0 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
136b0 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
136c0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
136d0 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
136e0 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
136f0 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
13700 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
13710 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
13720 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
13730 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
13740 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
13750 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
13760 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
13770 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
13780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13790 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
137a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
137b0 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
137c0 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
137d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
137e0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
137f0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
13800 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
13810 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
13820 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
13830 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
13840 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
13850 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
13860 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
13870 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  iTab;.  }..  if(
13880 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21   aiMap && eType!
13890 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
138a0 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e  ASC && eType!=IN
138b0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
138c0 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  C ){.    int i, 
138d0 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
138e0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
138f0 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
13900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
13910 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69  ++) aiMap[i] = i
13920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
13930 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
13940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13950 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
13960 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70  ** Argument pExp
13970 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e  r is an (?, ?...
13980 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  ) IN(...) expres
13990 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66  sion. This .** f
139a0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
139b0 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
139c0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
139d0 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
139e0 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74   .** the affinit
139f0 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66  ies to be used f
13a00 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
13a10 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
13a20 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  ..**.** It is th
13a30 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
13a40 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
13a50 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
13a60 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74  e returned.** st
13a70 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c  ring is eventual
13a80 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  ly freed using s
13a90 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
13aa0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
13ab0 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50  exprINAffinity(P
13ac0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
13ad0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
13ae0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
13af0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20  r->pLeft;.  int 
13b00 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
13b10 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
13b20 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ft);.  Select *p
13b30 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d  Select = (pExpr-
13b40 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
13b50 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e  elect) ? pExpr->
13b60 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20  x.pSelect : 0;. 
13b70 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
13b80 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
13b90 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52  p==TK_IN );.  zR
13ba0 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
13bb0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
13bc0 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20  >db, nVal+1);.  
13bd0 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
13be0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13bf0 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
13c00 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
13c10 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
13c20 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
13c30 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68  ft, i);.      ch
13c40 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78  ar a = sqlite3Ex
13c50 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a  prAffinity(pA);.
13c60 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63        if( pSelec
13c70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  t ){.        zRe
13c80 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f  t[i] = sqlite3Co
13c90 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53  mpareAffinity(pS
13ca0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
13cb0 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20  [i].pExpr, a);. 
13cc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13cd0 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b      zRet[i] = a;
13ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13cf0 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20     zRet[nVal] = 
13d00 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75  '\0';.  }.  retu
13d10 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn zRet;.}.#endi
13d20 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
13d30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
13d40 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50  /*.** Load the P
13d50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73  arse object pass
13d60 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
13d70 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  argument with an
13d80 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
13d90 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
13da0 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
13db0 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
13dc0 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
13dd0 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73   M".*/   .void s
13de0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
13df0 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
13e00 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c  se, int nActual,
13e10 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20   int nExpect){. 
13e20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
13e30 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20  t = "sub-select 
13e40 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d  returns %d colum
13e50 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64  ns - expected %d
13e60 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  ";.  sqlite3Erro
13e70 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d  rMsg(pParse, zFm
13e80 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70  t, nActual, nExp
13e90 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ect);.}.#endif..
13ea0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13eb0 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
13ec0 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
13ed0 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
13ee0 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
13ef0 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
13f00 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
13f10 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
13f20 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
13f30 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
13f40 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
13f50 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
13f60 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
13f70 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
13f80 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
13f90 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
13fa0 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
13fb0 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
13fc0 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
13fd0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
13fe0 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
13ff0 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
14000 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
14010 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
14020 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
14030 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
14040 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
14050 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
14060 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
14070 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
14080 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
14090 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
140a0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
140b0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
140c0 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
140d0 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
140e0 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
140f0 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
14100 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
14110 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
14120 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
14130 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
14140 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
14150 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
14160 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
14170 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
14180 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
14190 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
141a0 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
141b0 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
141c0 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
141d0 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
141e0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
141f0 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
14200 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
14210 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
14220 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
14230 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
14240 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
14250 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
14260 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
14270 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
14280 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
14290 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
142a0 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
142b0 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
142c0 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
142d0 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
142e0 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
142f0 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
14300 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
14310 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
14320 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
14330 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
14340 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
14350 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
14360 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
14370 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
14380 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
14390 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
143a0 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
143b0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
143c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
143d0 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
143e0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
143f0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
14400 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
14410 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
14420 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
14430 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14440 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14450 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
14460 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
14470 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14480 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14490 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
144a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
144b0 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
144c0 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
144d0 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
144e0 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
144f0 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
14500 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
14510 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
14520 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
14530 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
14540 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
14550 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
14560 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
14570 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
14580 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
14590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
145a0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
145b0 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
145c0 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
145d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145f0 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
14600 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
14610 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
14620 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14630 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
14640 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
14650 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14660 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
14670 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
14680 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
14690 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
146a0 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
146b0 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
146c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
146d0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
146e0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
146f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
14700 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
14710 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
14720 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
14730 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
14740 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
14750 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
14760 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
14770 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
14780 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
14790 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
147a0 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
147b0 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
147c0 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
147d0 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
147e0 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
147f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
14800 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
14810 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
14820 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
14830 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
14840 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14850 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
14860 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
14870 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
14880 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
14890 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
148a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
148b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
148c0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
148d0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
148e0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
148f0 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
14900 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
14910 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
14920 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  s SUBQUERY %d",.
14930 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
14940 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
14950 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
14960 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
14970 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
14980 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72  R",.        pPar
14990 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
149a0 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
149b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
149c0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
149d0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
149e0 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
149f0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65  DYNAMIC);.  }.#e
14a00 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
14a10 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
14a20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
14a30 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
14a60 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
14a70 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
14a80 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
14a90 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
14aa0 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
14ab0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
14ac0 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  /.      KeyInfo 
14ad0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
14ae0 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72      /* Key infor
14af0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
14b00 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20  int nVal;       
14b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14b20 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c  ize of vector pL
14b30 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20  eft */.      .  
14b40 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
14b50 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
14b60 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  (pLeft);.      a
14b70 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
14b80 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20  || nVal==1 );.. 
14b90 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
14ba0 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
14bb0 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
14bc0 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
14bd0 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
14be0 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
14bf0 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
14c00 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65   way.  An epheme
14c10 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ral table is .  
14c20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
14c30 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  th index keys re
14c40 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
14c50 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
14c60 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
14c70 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
14c80 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
14c90 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
14ca0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
14cb0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
14cc0 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
14cd0 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
14ce0 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
14cf0 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
14d00 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
14d10 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
14d20 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
14d30 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
14d40 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
14d50 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
14d60 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
14d70 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
14d80 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
14d90 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
14da0 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
14db0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
14dc0 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
14dd0 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
14de0 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
14df0 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
14e00 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
14e10 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
14e20 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
14e30 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
14e40 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
14e50 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
14e60 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
14e70 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
14e80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14e90 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14ea0 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20  hemeral, .      
14eb0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
14ec0 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56  e, (isRowid?0:nV
14ed0 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  al));.      pKey
14ee0 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f  Info = isRowid ?
14ef0 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49   0 : sqlite3KeyI
14f00 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
14f10 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a  >db, nVal, 1);..
14f20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
14f30 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14f40 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14f50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
14f60 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
14f70 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
14f80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
14f90 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
14fa0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
14fb0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
14fc0 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
14fd0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
14fe0 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
14ff0 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
15000 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
15010 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
15020 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d  pSelect = pExpr-
15030 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
15040 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
15050 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
15060 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
15070 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
15080 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d );.        /* 
15090 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52  If the LHS and R
150a0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
150b0 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74  rator do not mat
150c0 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20  ch, that.       
150d0 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68   ** error will h
150e0 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20  ave been caught 
150f0 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72  long before we r
15100 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e  each this point.
15110 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
15120 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e  ALWAYS(pEList->n
15130 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20  Expr==nVal) ){. 
15140 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44           SelectD
15150 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
15160 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15170 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15180 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15190 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
151a0 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
151b0 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64       dest.zAffSd
151c0 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  st = exprINAffin
151d0 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
151e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  r);.          as
151f0 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
15200 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
15210 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
15220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  );.          pSe
15230 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
15240 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
15250 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73  case( pSelect->s
15260 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
15270 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
15280 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
15290 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
152a0 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
152b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
152c0 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
152d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
152e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
152f0 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
15300 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15310 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
15320 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
15330 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
15340 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
15350 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
15360 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
15370 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
15380 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
15390 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
153a0 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
153b0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
153c0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
153d0 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
153e0 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
153f0 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
15400 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
15410 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15420 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
15430 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
15440 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
15450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
15460 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
15470 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
15480 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ) );.          f
15490 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
154a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
154b0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
154c0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
154d0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
154e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65  .            pKe
154f0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
15500 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
15510 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15530 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
15540 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20  ->a[i].pExpr.   
15550 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
15560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15570 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
15580 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
15590 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
155a0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
155b0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
155c0 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
155d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
155e0 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
155f0 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
15600 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
15610 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
15620 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
15630 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
15640 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
15650 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
15660 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
15670 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
15680 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
15690 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
156a0 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
156b0 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
156c0 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
156d0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
156e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
156f0 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
15700 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ty;            /
15710 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
15720 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
15730 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
15740 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
15750 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
15760 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
15770 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
15780 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
15790 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
157a0 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20   r2, r3;..      
157b0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
157c0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
157d0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  (pLeft);.       
157e0 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
157f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
15800 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
15810 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
15820 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
15830 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
15840 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15850 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
15860 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
15870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
15880 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
15890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
158a0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
158b0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
158c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
158d0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
158e0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
158f0 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
15900 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
15910 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15920 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
15930 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
15940 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15950 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
15960 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
15970 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15980 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
15990 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
159a0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
159b0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
159c0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
159d0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
159e0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
159f0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
15a00 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
15a10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
15a20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
15a30 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
15a40 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
15a50 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
15a60 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
15a70 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
15a80 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
15a90 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
15aa0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
15ab0 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
15ac0 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
15ad0 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
15ae0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
15af0 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
15b00 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
15b10 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
15b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15b30 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
15b40 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
15b50 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
15b60 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
15b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15b80 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
15b90 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
15ba0 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
15bb0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
15bc0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
15bd0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
15be0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
15bf0 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
15c00 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
15c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
15c20 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
15c30 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
15c40 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
15c50 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
15c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15c70 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
15c80 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
15c90 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
15ca0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
15cb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
15cc0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
15cd0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
15ce0 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
15cf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
15d00 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
15d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15d20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
15d30 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15d60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15d70 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
15d80 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
15d90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15db0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15dc0 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
15dd0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
15de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
15df0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
15e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e10 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
15e20 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
15e30 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15e50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
15e60 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
15e70 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
15e80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15e90 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
15ea0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
15eb0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
15ec0 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
15ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15f00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15f10 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15f20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15f30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15f40 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
15f50 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
15f60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15f70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
15f80 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
15f90 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
15fa0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
15fb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15fc0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
15fd0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
15fe0 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
15ff0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
16000 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28   /* Case 3:    (
16010 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
16020 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ...).      **   
16030 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28    or:    EXISTS(
16040 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
16050 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ...).      **.  
16060 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c      ** For a SEL
16070 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
16080 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76 61  de to put the va
16090 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  lues for all col
160a0 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a  umns of.      **
160b0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
160c0 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
160d0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
160e0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
160f0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
16100 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
16110 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16120 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
16130 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20  XISTS, write an 
16140 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
16150 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
16160 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sts).      ** in
16170 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
16180 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
16190 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
161a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
161b0 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
161c0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
161d0 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
161e0 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20  IT 1".  Any .   
161f0 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
16200 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61  g limit is disca
16210 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  rded in place of
16220 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31   the new LIMIT 1
16230 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16240 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
16270 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
16280 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
16290 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
162c0 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
162d0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
162e0 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16310 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
16320 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
16330 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
16340 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
16350 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
16360 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
16370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16380 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
16390 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
163a0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
163b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
163c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
163d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
163e0 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
163f0 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
16400 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67  lect;.      nReg
16410 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
16420 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
16430 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
16440 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
16450 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
16460 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
16470 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
16480 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
16490 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
164a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
164b0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
164c0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
164d0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
164e0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
164f0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
16500 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
16510 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
16520 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16530 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
16540 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
16550 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
16560 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
16570 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
16580 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
16590 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
165a0 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
165b0 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
165c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
165d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
165e0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
165f0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
16600 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16610 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
16620 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
16630 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16640 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
16650 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
16660 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
16670 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
16680 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
16690 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45  rse->db, TK_INTE
166a0 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
166d0 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
166e0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
166f0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
16700 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sel->selFlags &=
16710 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b   ~SF_MultiValue;
16720 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
16730 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16740 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
16750 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16760 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16770 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
16780 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
16790 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
167a0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
167b0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
167c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
167d0 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
167e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
167f0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
16800 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
16810 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
16820 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
16830 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
16840 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16850 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
16860 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
16870 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16880 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
16890 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
168a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
168b0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
168c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
168d0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
168e0 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49  Expr pIn is an I
168f0 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
16900 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
16910 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
16920 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
16930 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
16940 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20  e IN() operator 
16950 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
16960 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d  ber of .** colum
16970 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72  ns as the vector
16980 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c   on the LHS. Or,
16990 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
169a0 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a  he IN() is not .
169b0 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20  ** a sub-query, 
169c0 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20  that the LHS is 
169d0 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65  a vector of size
169e0 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
169f0 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61  e3ExprCheckIN(Pa
16a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16a10 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  r *pIn){.  int n
16a20 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
16a30 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16a40 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  In->pLeft);.  if
16a50 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20  ( (pIn->flags & 
16a60 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16a70 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
16a80 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
16a90 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
16aa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16ab0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
16ac0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
16ad0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
16ae0 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
16af0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
16b00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16b10 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
16b20 20 20 20 20 69 66 28 20 28 70 49 6e 2d 3e 70 4c      if( (pIn->pL
16b30 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
16b40 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
16b50 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16b60 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16b70 2c 20 6e 56 65 63 74 6f 72 2c 20 31 29 3b 0a 20  , nVector, 1);. 
16b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16ba0 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
16bb0 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
16bc0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
16bd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16be0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
16bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16c00 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
16c10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16c20 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
16c30 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
16c40 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
16c50 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
16c60 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
16c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
16c80 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
16c90 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76  is a scalar or v
16ca0 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
16cb0 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74  .  The .** right
16cc0 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
16cd0 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
16ce0 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61  zero or more sca
16cf0 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61  lar values, or a
16d00 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49  .** subquery.  I
16d10 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73  f the RHS is a s
16d20 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d  ubquery, the num
16d30 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
16d40 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61  lumns must.** ma
16d50 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
16d60 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
16d70 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
16d80 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  HS.  If the RHS 
16d90 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  is.** a list of 
16da0 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20  values, the LHS 
16db0 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72  must be a scalar
16dc0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20  . .**.** The IN 
16dd0 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65  operator is true
16de0 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75   if the LHS valu
16df0 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  e is contained w
16e00 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a  ithin the RHS..*
16e10 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
16e20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  false if the LHS
16e30 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e   is definitely n
16e40 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ot in the RHS.  
16e50 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69  The .** result i
16e60 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72  s NULL if the pr
16e70 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48  esence of the LH
16e80 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e  S in the RHS can
16e90 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72  not be .** deter
16ea0 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c  mined due to NUL
16eb0 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  Ls..**.** This r
16ec0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
16ed0 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73   code that jumps
16ee0 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
16ef0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
16f00 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
16f10 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
16f20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
16f30 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
16f40 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
16f50 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
16f60 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
16f70 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
16f80 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
16f90 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
16fa0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
16fb0 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
16fc0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
16fd0 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72  separate in-oper
16fe0 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74  ator.md document
16ff0 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68  ation file in th
17000 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53  e canonical.** S
17010 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
17020 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
17030 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
17040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
17050 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
17060 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17070 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
17080 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
17090 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
170a0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
170b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
170c0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
170d0 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
170e0 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
170f0 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
17100 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
17110 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
17120 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
17130 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
17140 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
17150 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
17160 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
17170 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
17180 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
17190 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
171a0 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
171b0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
171c0 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
171d0 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
171e0 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
171f0 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20  int rLhs;       
17200 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
17210 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65  r(s) holding the
17220 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20   LHS values */. 
17230 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20   int rLhsOrig;  
17240 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61         /* LHS va
17250 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65  lues prior to re
17260 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61  ordering by aiMa
17270 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  p[] */.  Vdbe *v
17280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17290 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
172a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
172b0 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d  /.  int *aiMap =
172c0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70   0;       /* Map
172d0 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65   from vector fie
172e0 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ld to index colu
172f0 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  mn */.  char *zA
17300 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ff = 0;       /*
17310 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
17320 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73   for comparisons
17330 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f   */.  int nVecto
17340 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r;          /* S
17350 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66  ize of vectors f
17360 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
17370 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75  tor */.  int iDu
17380 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  mmy;           /
17390 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65  * Dummy paramete
173a0 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63  r to exprCodeVec
173b0 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20  tor() */.  Expr 
173c0 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
173d0 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
173e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
173f0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
17400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f            /* loo
17410 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
17420 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20  nt destStep2;   
17430 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
17440 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73   jump when NULLs
17450 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20   seen in step 2 
17460 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
17470 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74  p6 = 0;    /* St
17480 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20  art of code for 
17490 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  Step 6 */.  int 
174a0 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20  addrTruthOp;    
174b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
174c0 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65  opcode that dete
174d0 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73  rmines the IN is
174e0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64   true */.  int d
174f0 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  estNotNull;     
17500 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17510 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   a comparison is
17520 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65   not true in ste
17530 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
17540 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  rTop;          /
17550 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65  * Top of the ste
17560 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20  p-6 loop */ ..  
17570 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
17580 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  Left;.  if( sqli
17590 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
175a0 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
175b0 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d  return;.  zAff =
175c0 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
175d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
175e0 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69    nVector = sqli
175f0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
17600 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
17610 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a  .  aiMap = (int*
17620 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
17630 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72  Zero(.      pPar
17640 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a  se->db, nVector*
17650 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
17660 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31  izeof(char)) + 1
17670 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  .  );.  if( pPar
17680 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
17690 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69  iled ) goto sqli
176a0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
176b0 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41  m_error;..  /* A
176c0 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74  ttempt to comput
176d0 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72  e the RHS. After
176e0 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61   this step, if a
176f0 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
17700 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58  an.  ** IN_INDEX
17710 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
17720 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65  d, the table ope
17730 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70  ned ith cursor p
17740 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20  Expr->iTable .  
17750 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
17760 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
17770 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20   up the RHS. If 
17780 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
17790 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20   returned,.  ** 
177a0 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20  the RHS has not 
177b0 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  yet been coded. 
177c0 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
177d0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
177e0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
177f0 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
17800 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
17810 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
17820 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
17830 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
17840 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
17850 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
17860 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20  pParse, pExpr,. 
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49              IN_I
17890 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
178a0 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  | IN_INDEX_NOOP_
178b0 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK,.            
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
178e0 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26  stIfNull ? 0 : &
178f0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d  rRhsHasNull, aiM
17900 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ap);..  assert( 
17910 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
17920 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
17930 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
17940 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
17950 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
17960 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
17970 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
17980 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
17990 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
179a0 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
179b0 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
179c0 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
179d0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
179e0 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
179f0 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
17a00 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
17a10 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
17a20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
17a30 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
17a40 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
17a50 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
17a60 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
17a70 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
17a80 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
17a90 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
17aa0 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
17ab0 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
17ac0 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
17ad0 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
17ae0 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
17af0 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
17b00 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
17b10 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
17b20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
17b30 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
17b40 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
17b50 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
17b60 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
17b70 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
17b80 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
17b90 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
17ba0 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
17bb0 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
17bc0 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
17bd0 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
17be0 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
17bf0 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
17c00 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
17c10 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
17c20 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
17c30 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dex..  */.  sqli
17c40 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
17c50 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73  (pParse);.  rLhs
17c60 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
17c70 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
17c80 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
17c90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
17ca0 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
17cb0 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
17cc0 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
17cd0 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
17ce0 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
17cf0 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
17d00 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
17d10 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
17d20 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
17d30 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
17d40 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
17d50 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
17d60 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
17d70 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
17d80 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17d90 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
17da0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17db0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
17dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17dd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
17de0 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
17df0 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
17e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17e10 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
17e20 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
17e30 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
17e40 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
17e50 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
17e60 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
17e70 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
17e80 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
17e90 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
17ea0 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
17eb0 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
17ec0 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
17ed0 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
17ee0 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
17ef0 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
17f00 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
17f10 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
17f20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17f30 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17f40 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
17f50 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
17f60 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
17f70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
17f80 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
17f90 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
17fa0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17fb0 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
17fc0 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
17fd0 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
17fe0 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
17ff0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18000 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
18010 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
18020 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
18030 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
18040 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
18050 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18060 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18080 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
18090 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65  , rLhs, rLhs, re
180a0 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
180b0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
180c0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
180d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
180e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
180f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
18100 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
18110 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
18120 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
18130 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
18140 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
18150 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
18160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18170 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18180 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
18190 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
181a0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
181b0 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
181c0 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
181d0 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
181e0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
181f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18200 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20  v, OP_Eq, rLhs, 
18210 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
18240 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
18250 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
18260 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
18270 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
18280 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
18290 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
182a0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
182b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
182c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
182d0 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
182e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
182f0 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
18300 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
18310 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18320 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18330 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66  Ne, rLhs, destIf
18340 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18360 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
18370 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
18380 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
183a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
183b0 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45  zAff[0] | SQLITE
183c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
183d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
183e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
183f0 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
18400 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
18410 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
18420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18440 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
18450 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
18460 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18480 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
18490 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
184a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
184b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
184c0 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
184d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
184e0 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
184f0 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c  l);.    goto sql
18500 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
18510 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20  inished;.  }..  
18520 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b  /* Step 2: Check
18530 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
18540 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  HS contains any 
18550 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49  NULL columns.  I
18560 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64  f the.  ** LHS d
18570 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  oes contain NULL
18580 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  s then the resul
18590 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
185a0 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a   FALSE or NULL..
185b0 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65    ** We will the
185c0 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72  n skip the binar
185d0 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  y search of the 
185e0 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
185f0 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
18600 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64  IfFalse ){.    d
18610 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49  estStep2 = destI
18620 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  fFalse;.  }else{
18630 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
18640 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c   destStep6 = sql
18650 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18660 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  l(v);.  }.  for(
18670 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
18680 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
18690 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
186a0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
186b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
186c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
186d0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
186e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
186f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18700 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c  _IsNull, rLhs+i,
18710 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20   destStep2);.   
18720 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18730 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
18740 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65   /* Step 3.  The
18750 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77   LHS is now know
18760 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
18770 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79  .  Do the binary
18780 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20   search.  ** of 
18790 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68  the RHS using th
187a0 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65  e LHS as a probe
187b0 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65  .  If found, the
187c0 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20   result is.  ** 
187d0 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  true..  */.  if(
187e0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
187f0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
18800 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
18810 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
18820 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
18830 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c  ree and so we al
18840 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74  so.    ** know t
18850 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e  hat the RHS is n
18860 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  on-NULL.  Hence,
18870 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70   we combine step
18880 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a  s 3 and 4.    **
18890 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
188a0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71  pcode. */.    sq
188b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
188c0 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
188d0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
188e0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68  destIfFalse, rLh
188f0 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  s);.    VdbeCove
18900 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
18910 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74  rTruthOp = sqlit
18920 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
18930 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65  OP_Goto);  /* Re
18940 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d  turn True */.  }
18950 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
18960 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18970 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73  P_Affinity, rLhs
18980 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41  , nVector, 0, zA
18990 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  ff, nVector);.  
189a0 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
189b0 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b  e==destIfNull ){
189c0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  .      /* Combin
189d0 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65  e Step 3 and Ste
189e0 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  p 5 into a singl
189f0 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
18a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18a10 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
18a20 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
18a30 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
18a40 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
18a60 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
18a70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18a80 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
18a90 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
18aa0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
18ab0 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
18ac0 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
18ad0 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
18ae0 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
18af0 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
18b00 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
18b10 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18b20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
18b30 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20  >iTable, 0,.    
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
18b70 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18b80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
18b90 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53  p 4.  If the RHS
18ba0 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
18bb0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20  non-NULL and we 
18bc0 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a  did not find.  *
18bd0 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68  * an match on th
18be0 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20  e search above, 
18bf0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
18c00 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20  must be FALSE.. 
18c10 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61   */.  if( rRhsHa
18c20 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72  sNull && nVector
18c30 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
18c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18c50 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73  OP_NotNull, rRhs
18c60 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46  HasNull, destIfF
18c70 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43  alse);.    VdbeC
18c80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
18c90 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49  .  /* Step 5.  I
18ca0 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  f we do not care
18cb0 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65   about the diffe
18cc0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55  rence between NU
18cd0 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53  LL and.  ** FALS
18ce0 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  E, then just ret
18cf0 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f  urn false. .  */
18d00 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c  .  if( destIfFal
18d10 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
18d20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
18d30 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
18d40 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20  ;..  /* Step 6: 
18d50 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77  Loop through row
18d60 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43  s of the RHS.  C
18d70 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20  ompare each row 
18d80 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a  to the LHS..  **
18d90 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73   If any comparis
18da0 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  on is NULL, then
18db0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
18dc0 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a  ULL.  If all.  *
18dd0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72  * comparisons ar
18de0 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65  e FALSE then the
18df0 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73   final result is
18e00 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a   FALSE..  **.  *
18e10 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c  * For a scalar L
18e20 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63  HS, it is suffic
18e30 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75  ient to check ju
18e40 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  st the first row
18e50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
18e60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
18e70 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33  tStep6 ) sqlite3
18e80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18e90 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a  (v, destStep6);.
18ea0 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
18eb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18ec0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
18ed0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
18ee0 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43  fFalse);.  VdbeC
18ef0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
18f00 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
18f10 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
18f20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18f30 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73  Label(v);.  }els
18f40 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56  e{.    /* For nV
18f50 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e  ector==1, combin
18f60 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20  e steps 6 and 7 
18f70 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  by immediately r
18f80 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eturning.    ** 
18f90 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72  FALSE if the fir
18fa0 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  st comparison is
18fb0 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   not NULL */.   
18fc0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64   destNotNull = d
18fd0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a  estIfFalse;.  }.
18fe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
18ff0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
19000 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c  Expr *p;.    Col
19010 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
19020 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65   int r3 = sqlite
19030 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19040 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  se);.    p = sql
19050 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
19060 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
19070 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
19080 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
19090 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
190a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190b0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
190c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
190d0 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69  i, r3);.    sqli
190e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
190f0 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20   OP_Ne, rLhs+i, 
19100 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c  destNotNull, r3,
19110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19120 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
19130 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
19140 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19150 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19160 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19170 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
19180 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
19190 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
191a0 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
191b0 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
191c0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
191d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
191e0 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29  (v, destNotNull)
191f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19200 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
19210 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  xt, pExpr->iTabl
19220 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  e, addrTop+1);. 
19230 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
19240 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70  v);..    /* Step
19250 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68   7:  If we reach
19260 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
19270 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
19280 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  sult must.    **
19290 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20   be false. */.  
192a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
192b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
192c0 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
192d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73  .  }..  /* Jumps
192e0 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
192f0 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a  o return true. *
19300 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
19310 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
19320 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65  ruthOp);..sqlite
19330 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
19340 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73  shed:.  if( rLhs
19350 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c  !=rLhsOrig ) sql
19360 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19370 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29  eg(pParse, rLhs)
19380 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
19390 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
193a0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
193b0 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
193c0 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43  ));.sqlite3ExprC
193d0 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a  odeIN_oom_error:
193e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
193f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d  (pParse->db, aiM
19400 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ap);.  sqlite3Db
19410 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
19420 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66   zAff);.}.#endif
19430 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19440 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
19450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19460 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
19470 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
19480 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
19490 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
194a0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
194b0 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
194c0 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
194d0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
194e0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
194f0 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
19500 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
19510 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
19520 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
19530 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
19540 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
19550 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
19560 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
19570 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
19580 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
19590 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
195a0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
195b0 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
195c0 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
195d0 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
195e0 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
195f0 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
19600 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
19610 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
19620 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
19630 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
19640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19650 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
19660 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
19670 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
19680 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
19690 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
196a0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
196b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
196c0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
196d0 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
196e0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
196f0 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
19700 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
19710 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
19720 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
19730 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
19740 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
19750 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
19760 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
19770 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
19780 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
19790 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
197a0 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
197b0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
197c0 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
197d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
197e0 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
197f0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
19800 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
19810 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
19820 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
19830 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
19840 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
19850 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
19860 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
19870 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
19880 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
19890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
198a0 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
198b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
198c0 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
198d0 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
198e0 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
198f0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
19900 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
19910 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
19920 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
19930 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
19940 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
19950 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
19960 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
19970 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
19980 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
19990 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
199a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
199b0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
199c0 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
199d0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
199e0 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
199f0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
19a00 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19a10 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
19a20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19a30 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
19a40 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
19a50 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
19a60 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
19a70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19a80 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
19a90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
19aa0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
19ab0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19ac0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19ad0 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
19ae0 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
19af0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
19b00 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
19b10 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
19b20 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
19b30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
19b40 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19b50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  }.}../*.** Erase
19b60 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e   column-cache en
19b70 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a  try number i.*/.
19b80 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
19b90 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
19ba0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
19bb0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
19bc0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
19bd0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
19be0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
19bf0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
19c00 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
19c10 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
19c20 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
19c30 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
19c40 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
19c50 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
19c60 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
19c70 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20  lCache--;.  if( 
19c80 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
19c90 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61 72 73  che ){.    pPars
19ca0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20  e->aColCache[i] 
19cb0 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
19cc0 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  che[pParse->nCol
19cd0 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a  Cache];.  }.}...
19ce0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
19cf0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
19d00 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
19d10 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
19d20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
19d30 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
19d40 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
19d50 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
19d60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19d70 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
19d80 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
19d90 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
19da0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
19db0 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
19dc0 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
19dd0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
19de0 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e  ..  /* Unless an
19df0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
19e00 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75  red, register nu
19e10 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
19e20 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20   positive. */.  
19e30 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c  assert( iReg>0 |
19e40 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
19e50 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
19e60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19e70 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
19e80 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
19e90 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
19ea0 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
19eb0 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
19ec0 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
19ed0 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
19ee0 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
19ef0 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
19f00 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
19f10 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
19f20 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
19f30 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
19f40 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
19f50 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
19f60 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
19f70 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
19f80 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
19f90 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
19fa0 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65  olumnCache) ) re
19fb0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
19fc0 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
19fd0 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
19fe0 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
19ff0 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
1a000 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
1a010 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
1a020 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
1a030 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
1a040 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
1a050 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
1a060 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
1a070 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
1a080 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1a090 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1a0a0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1a0b0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1a0c0 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
1a0d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1a0e0 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
1a0f0 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
1a100 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1a110 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
1a120 65 20 69 73 20 61 6c 72 65 61 64 79 20 66 75 6c  e is already ful
1a130 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  l, delete the le
1a140 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
1a150 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28  d entry */.  if(
1a160 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1a170 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  he>=SQLITE_N_COL
1a180 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e  CACHE ){.    min
1a190 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
1a1a0 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d 20 2d  ;.    idxLru = -
1a1b0 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  1;.    for(i=0, 
1a1c0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1a1d0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1a1e0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1a1f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1a200 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
1a210 20 20 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d          idxLru =
1a220 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c   i;.        minL
1a230 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
1a240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1a250 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a260 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
1a270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
1a280 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1a290 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  he[pParse->nColC
1a2a0 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20  ache++];.  }..  
1a2b0 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 65  /* Add the new e
1a2c0 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e 64 20  ntry to the end 
1a2d0 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  of the cache */.
1a2e0 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
1a2f0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a300 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  l;.  p->iTable =
1a310 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c   iTab;.  p->iCol
1a320 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d  umn = iCol;.  p-
1a330 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
1a340 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1a350 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1a360 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1a370 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1a380 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
1a390 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
1a3a0 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
1a3b0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
1a3c0 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
1a3d0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1a3e0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
1a3f0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
1a400 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a410 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
1a420 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
1a430 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
1a440 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
1a450 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1a460 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73 74 72  Cache ){.    str
1a470 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1a480 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a490 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66  Cache[i];.    if
1a4a0 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65  ( p->iReg >= iRe
1a4b0 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69  g && p->iReg < i
1a4c0 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  Reg+nReg ){.    
1a4d0 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1a4e0 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  r(pParse, i);.  
1a4f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1a500 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1a510 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
1a520 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
1a530 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
1a540 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
1a550 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
1a560 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
1a570 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
1a580 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
1a590 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
1a5a0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
1a5b0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
1a5c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a5d0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
1a5e0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
1a5f0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
1a600 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a610 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1a620 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a630 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a640 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1a650 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
1a660 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a670 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1a680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
1a690 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
1a6a0 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
1a6b0 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
1a6c0 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
1a6d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
1a6e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1a6f0 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
1a700 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1a710 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
1a720 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
1a730 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
1a740 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1a750 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
1a760 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1a770 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
1a780 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1a790 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1a7a0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20  >iCacheLevel>=1 
1a7b0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  );.  pParse->iCa
1a7c0 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64  cheLevel--;.#ifd
1a7d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a7e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1a7f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1a800 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1a810 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
1a820 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  OP  to %d\n", pP
1a830 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a840 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  l);.  }.#endif. 
1a850 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1a860 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1a870 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
1a880 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76  ColCache[i].iLev
1a890 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
1a8a0 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
1a8b0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
1a8c0 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
1a8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b  }else{.      i++
1a8e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a8f0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
1a900 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
1a910 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
1a920 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
1a930 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
1a940 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
1a950 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
1a960 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
1a970 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
1a980 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
1a990 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
1a9a0 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
1a9b0 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
1a9c0 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
1a9d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1a9e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1a9f0 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
1aa00 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1aa10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1aa20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1aa30 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
1aa40 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1aa50 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1aa60 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1aa70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1aa80 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1aa90 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1aaa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1aab0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1aac0 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
1aad0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
1aae0 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
1aaf0 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
1ab00 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
1ab10 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1ab20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
1ab30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ab40 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
1ab50 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1ab60 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
1ab70 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ab80 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
1ab90 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1aba0 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
1abb0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1abc0 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1abd0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1abe0 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
1abf0 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
1ac00 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
1ac10 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1ac20 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
1ac30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1ac40 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1ac50 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
1ac60 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1ac70 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
1ac80 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
1ac90 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
1aca0 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
1acb0 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
1acc0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1acd0 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
1ace0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1acf0 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
1ad00 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
1ad10 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1ad20 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71   iTabCur;.    sq
1ad30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1ad40 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1ad50 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1ad60 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1ad70 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1ad80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ad90 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1ada0 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1adb0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1adc0 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1adf0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1ae00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1ae10 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1ae20 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1ae30 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1ae40 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1ae50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1ae60 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1ae70 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1ae80 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1ae90 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1aea0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1aeb0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1aec0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1aed0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1aee0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1aef0 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1af00 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1af10 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1af20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1af30 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1af40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1af50 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1af60 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1af70 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1af80 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1af90 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1afa0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
1afb0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1afc0 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1afd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1afe0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1aff0 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1b000 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b010 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1b020 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1b030 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1b040 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1b050 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1b060 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1b070 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1b080 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1b090 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1b0a0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1b0b0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1b0c0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1b0d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b0e0 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1b0f0 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1b100 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1b110 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b120 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1b130 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1b140 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1b150 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b160 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1b170 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1b180 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1b190 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1b1a0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1b1b0 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
1b1c0 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20  ster. .**.** An 
1b1d0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1b1e0 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
1b1f0 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
1b200 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73  ster iReg.  This
1b210 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e  .** is not garan
1b220 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c  teeed for GetCol
1b230 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75  umn() - the resu
1b240 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  lt can be stored
1b250 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73   in.** any regis
1b260 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65  ter.  But the re
1b270 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65  sult is guarante
1b280 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65  ed to land in re
1b290 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66  gister iReg.** f
1b2a0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  or GetColumnToRe
1b2b0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  g()..**.** There
1b2c0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1b2d0 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
1b2e0 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
1b2f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1b300 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
1b310 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
1b320 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
1b330 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
1b340 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
1b350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1b360 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
1b370 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1b380 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1b390 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1b3a0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1b3b0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1b3c0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1b3d0 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1b3e0 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1b3f0 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1b400 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1b410 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1b420 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b430 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1b440 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1b450 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1b460 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
1b470 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1b480 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
1b490 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
1b4a0 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
1b4b0 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
1b4c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b4d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1b4e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1b4f0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
1b500 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b510 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1b520 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1b530 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b540 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  if( p->iTable==i
1b550 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
1b560 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
1b570 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
1b580 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
1b590 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
1b5a0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1b5b0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
1b5c0 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
1b5d0 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
1b5e0 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
1b5f0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1b600 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b610 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1b620 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1b630 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1b640 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1b650 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1b660 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
1b670 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
1b680 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1b690 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
1b6a0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1b6b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1b6c0 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  eg;.}.void sqlit
1b6d0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b6e0 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73  umnToReg(.  Pars
1b6f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1b700 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1b710 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1b720 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1b730 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1b740 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1b750 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1b760 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1b770 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1b780 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1b790 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1b7a0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b7b0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1b7c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1b7d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1b7e0 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
1b7f0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1b800 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1b810 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1b820 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1b830 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75  rse, pTab, iColu
1b840 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  mn, iTable, iReg
1b850 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d  , 0);.  if( r1!=
1b860 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64  iReg ) sqlite3Vd
1b870 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1b880 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1b890 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a  , r1, iReg);.}..
1b8a0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
1b8b0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
1b8c0 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
1b8d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1b8e0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
1b8f0 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  se){.  int i;..#
1b900 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1b910 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1b920 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1b930 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1b940 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
1b950 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
1b960 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
1b970 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1b980 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
1b990 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1b9a0 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a  ache[i].tempReg.
1b9b0 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e       && pParse->
1b9c0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1b9d0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1b9e0 52 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Reg).    ){.    
1b9f0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
1ba00 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
1ba10 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65  pReg++] = pParse
1ba20 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1ba30 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
1ba40 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1ba50 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  he = 0;.}../*.**
1ba60 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
1ba70 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
1ba80 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
1ba90 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
1baa0 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
1bab0 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
1bac0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1bad0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1bae0 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
1baf0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
1bb00 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
1bb10 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
1bb20 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1bb30 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
1bb40 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
1bb50 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1bb60 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1bb70 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1bb80 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1bb90 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1bba0 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
1bbb0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1bbc0 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
1bbd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bbe0 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
1bbf0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1bc00 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
1bc10 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nReg){.  assert(
1bc20 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
1bc30 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
1bc40 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
1bc50 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
1bc60 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
1bc70 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
1bc80 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Reg);.  sqlite3E
1bc90 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1bca0 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52  Parse, iFrom, nR
1bcb0 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  eg);.}..#if defi
1bcc0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1bcd0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1bce0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1bcf0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1bd00 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
1bd10 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
1bd20 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
1bd30 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
1bd40 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1bd50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1bd60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1bd70 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
1bd80 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
1bd90 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
1bda0 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
1bdb0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1bdc0 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1bdd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1bde0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1bdf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1be00 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1be10 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
1be20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1be30 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1be40 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1be50 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1be60 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1be70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
1be80 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
1be90 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
1bea0 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
1beb0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
1bec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1bed0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1bee0 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
1bef0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1bf00 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
1bf10 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70  ert a scalar exp
1bf20 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1bf30 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65  a TK_REGISTER re
1bf40 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67  ferencing.** reg
1bf50 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65  ister iReg.  The
1bf60 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1bf70 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c  ure that iReg al
1bf80 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ready contains.*
1bf90 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  * the correct va
1bfa0 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  lue for the expr
1bfb0 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1bfc0 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
1bfd0 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
1bfe0 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
1bff0 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
1c000 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
1c010 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
1c020 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
1c030 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
1c040 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
1c050 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   Evaluate an exp
1c060 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20  ression (either 
1c070 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
1c080 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29  alar expression)
1c090 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68   and store.** th
1c0a0 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74  e result in cont
1c0b0 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72  inguous temporar
1c0c0 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65  y registers.  Re
1c0d0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1c0e0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  f.** the first r
1c0f0 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20  egister used to 
1c100 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1c110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1c120 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1c130 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1c140 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74  porary scalar, t
1c150 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
1c160 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  * that register 
1c170 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46  number into *piF
1c180 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65  reeable.  If the
1c190 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1c1a0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20   register.** is 
1c1b0 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1c1c0 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
1c1d0 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72  sion is a vector
1c1e0 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65   set *piFreeable
1c1f0 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  .** to 0..*/.sta
1c200 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
1c210 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50  Vector(Parse *pP
1c220 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69  arse, Expr *p, i
1c230 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b  nt *piFreeable){
1c240 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a  .  int iResult;.
1c250 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20    int nResult = 
1c260 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
1c270 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20  rSize(p);.  if( 
1c280 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20  nResult==1 ){.  
1c290 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1c2a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c2b0 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65  pParse, p, piFre
1c2c0 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  eable);.  }else{
1c2d0 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65  .    *piFreeable
1c2e0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
1c2f0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
1c300 7b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  {.      iResult 
1c310 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1c320 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1c330 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
1c340 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1c350 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1c360 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1c370 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1c380 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1c390 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c3a0 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1c3b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c3c0 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
1c3d0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70  e(pParse, p->x.p
1c3e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1c3f0 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20  , i+iResult);.  
1c400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c410 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74    return iResult
1c420 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1c430 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
1c440 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
1c450 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1c460 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1c470 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
1c480 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1c490 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
1c4a0 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
1c4b0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1c4c0 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
1c4d0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1c4e0 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
1c4f0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
1c500 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
1c510 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
1c520 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
1c530 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
1c540 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
1c550 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
1c560 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
1c570 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1c580 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
1c590 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1c5a0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
1c5b0 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
1c5c0 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
1c5d0 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
1c5e0 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
1c5f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1c600 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
1c610 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c620 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1c630 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1c640 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
1c650 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
1c660 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1c670 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1c680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c690 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1c6a0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
1c6b0 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
1c6c0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
1c6d0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1c6e0 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
1c6f0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
1c700 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1c710 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1c720 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1c730 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
1c740 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
1c750 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1c760 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1c770 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1c780 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
1c790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1c7a0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
1c7b0 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70  numbers */.  Exp
1c7c0 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
1c7d0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1c7e0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
1c7f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20  ode */.  int p5 
1c800 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1c810 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1c820 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1c830 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
1c840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c850 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1c860 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1c870 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
1c880 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1c890 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1c8a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1c8b0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1c8c0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1c8d0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1c8e0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1c8f0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1c900 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1c910 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1c920 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1c930 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1c940 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1c950 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1c960 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1c970 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1c980 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1c990 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1c9a0 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d   return pCol->iM
1c9b0 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  em;.      }else 
1c9c0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1c9d0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1c9e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c9f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1ca00 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1ca10 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1ca20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ca40 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1ca50 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1ca60 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ca70 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1ca80 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1ca90 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1caa0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1cab0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1cac0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1cad0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1cae0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1caf0 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1cb00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1cb10 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1cb20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1cb30 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1cb40 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1cb50 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1cb60 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1cb70 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1cb80 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1cb90 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
1cba0 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  se;.        }els
1cbb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1cbc0 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73  Coding an expres
1cbd0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
1cbe0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68  t of an index wh
1cbf0 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ere column names
1cc00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1cc10 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72   the index refer
1cc20 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f   to the table to
1cc30 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
1cc40 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20   belongs */.    
1cc50 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
1cc60 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20  rse->iSelfTab;. 
1cc70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cc80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1cc90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1cca0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1ccb0 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1cce0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
1ccf0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1cd20 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  p2);.    }.    c
1cd30 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1cd40 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1cd50 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1cd60 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1cd70 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1cd80 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1cd90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1cda0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1cdb0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1cdc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cdd0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1cde0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1cdf0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
1ce00 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
1ce10 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
1ce20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ce30 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ce40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1ce50 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1ce60 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ce70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ce80 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ce90 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1cea0 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1ceb0 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1cec0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1ced0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1cee0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1cef0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1cf00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cf10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1cf20 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1cf30 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1cf40 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1cf50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1cf60 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1cf70 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1cf80 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1cf90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1cfa0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1cfb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cfc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1cfd0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1cfe0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1cff0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1d000 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1d010 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d020 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1d030 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1d040 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1d050 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1d060 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1d070 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1d080 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d090 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1d0a0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1d0b0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1d0c0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1d0d0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1d0e0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1d0f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d100 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1d110 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1d120 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1d130 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d140 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
1d150 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1d160 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1d170 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d180 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d190 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d1a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d1b0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d1c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1d1d0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1d1e0 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
1d1f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d200 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
1d210 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1d220 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1d230 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1d240 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
1d250 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1d260 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1d270 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20  n[0]=='?' .     
1d280 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d          || strcm
1d290 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1d2a0 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  n, pParse->azVar
1d2b0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
1d2c0 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1])==0 );.      
1d2d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d2e0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP4(v, -1, pPa
1d2f0 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
1d300 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34  ->iColumn-1], P4
1d310 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1d320 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
1d330 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1d340 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1d350 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1d360 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  n pExpr->iTable;
1d370 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1d380 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1d390 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1d3a0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1d3b0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1d3c0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1d3d0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1d3e0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1d3f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d400 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1d410 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1d420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1d430 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1d440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d450 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1d460 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1d470 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1d480 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1d490 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d4a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d4b0 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1d4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d4d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d4e0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1d4f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1d500 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d510 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
1d520 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
1d530 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
1d540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d550 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1d560 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
1d570 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 1);.      retu
1d580 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a  rn inReg;.    }.
1d590 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d5a0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
1d5b0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1d5c0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1d5d0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1d5e0 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1d5f0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70  : TK_NE;.      p
1d600 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  5 = SQLITE_NULLE
1d610 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c  Q;.      /* fall
1d620 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20  -through */.    
1d630 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1d640 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1d650 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1d660 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1d670 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1d680 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1d690 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1d6a0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1d6b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d6c0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c  3ExprIsVector(pL
1d6d0 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
1d6e0 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
1d6f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
1d700 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29   target, op, p5)
1d710 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d720 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1d730 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1d740 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
1d750 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1d760 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1d770 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1d780 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1d790 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1d7a0 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
1d7b0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1d7c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1d7d0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1d7e0 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
1d7f0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
1d800 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73   p5);.        as
1d810 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1d820 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1d830 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1d840 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d850 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Lt);.        as
1d860 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1d870 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1d880 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1d890 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d8a0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Le);.        as
1d8b0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
1d8c0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1d8d0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
1d8e0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d8f0 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Gt);.        as
1d900 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1d910 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1d920 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1d930 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d940 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Ge);.        as
1d950 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1d960 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1d970 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1d980 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d990 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Eq);.        as
1d9a0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1d9b0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1d9c0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1d9d0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1d9e0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  _Ne);.        te
1d9f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1da00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
1da10 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1da20 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1da30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1da40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1da50 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1da60 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1da70 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
1da80 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
1da90 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
1daa0 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
1dab0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
1dac0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1dad0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
1dae0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
1daf0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
1db00 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
1db10 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1db20 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1db30 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
1db40 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
1db50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1db60 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
1db70 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
1db80 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
1db90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dba0 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
1dbb0 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
1dbc0 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
1dbd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1dbe0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
1dbf0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
1dc00 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
1dc10 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
1dc20 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
1dc30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dc40 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
1dc50 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
1dc60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1dc70 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
1dc80 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
1dc90 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
1dca0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dcb0 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
1dcc0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1dcd0 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
1dce0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1dcf0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
1dd00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dd10 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
1dd20 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
1dd30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
1dd40 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
1dd50 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
1dd60 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
1dd70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dd80 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
1dd90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
1dda0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
1ddb0 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
1ddc0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
1ddd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dde0 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
1ddf0 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
1de00 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
1de10 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
1de20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1de30 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1de40 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1de50 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1de60 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1de70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1de80 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1de90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1dea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1deb0 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
1dec0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ded0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1dee0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1def0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1df00 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1df10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1df20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1df30 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1df40 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1df50 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
1df60 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
1df70 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1df80 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
1df90 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1dfa0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
1dfb0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1dfc0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1dfd0 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  et;.#ifndef SQLI
1dfe0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1dff0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1e000 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1e010 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1e020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e030 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e040 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e050 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1e060 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1e070 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1e080 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1e090 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65  eturn target;.#e
1e0a0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1e0b0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
1e0c0 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
1e0d0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
1e0e0 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
1e0f0 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
1e100 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
1e110 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
1e120 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e130 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e140 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
1e150 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e160 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1e170 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e180 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e190 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1e1a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e1b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
1e1c0 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
1e1d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e1e0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e1f0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1e200 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e210 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e220 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
1e230 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1e240 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
1e250 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
1e260 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e270 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
1e280 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1e290 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20  OT==OP_Not );   
1e2a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e2b0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
1e2c0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e2d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e2e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e2f0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e310 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e330 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1e340 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
1e350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e360 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1e370 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1e380 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
1e390 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
1e3a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1e3b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
1e3c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e3d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1e3e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1e3f0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1e400 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
1e410 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1e420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e430 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1e440 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
1e450 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e460 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e470 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e480 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e4a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e4b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
1e4c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1e4d0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
1e4e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e4f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1e500 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
1e510 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1e520 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
1e530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e540 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1e550 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
1e560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e570 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1e580 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
1e590 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e5a0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
1e5b0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
1e5c0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
1e5d0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
1e5e0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
1e5f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e600 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e610 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e620 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1e630 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1e640 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
1e650 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
1e660 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
1e670 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
1e680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1e690 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  urn pInfo->aFunc
1e6a0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
1e6b0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
1e6c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e6d0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1e6e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1e6f0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1e700 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1e710 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1e720 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
1e730 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
1e740 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
1e750 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1e760 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
1e770 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
1e780 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
1e790 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
1e7a0 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ect */.      con
1e7b0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
1e7c0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
1e7d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
1e7e0 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
1e7f0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
1e800 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1e810 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
1e820 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
1e830 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1e840 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1e850 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1e860 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e870 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
1e880 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1e890 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  nection */.     
1e8a0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
1e8b0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
1e8c0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
1e8d0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
1e8e0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
1e8f0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
1e900 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
1e910 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
1e920 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e930 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e940 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e950 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1e960 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e970 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1e980 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
1e990 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
1e9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e9b0 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
1e9c0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
1e9d0 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
1e9e0 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
1e9f0 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
1ea00 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ea10 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ea20 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ea30 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
1ea40 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1ea50 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
1ea60 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
1ea70 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  zId, nFarg, enc,
1ea80 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
1ea90 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
1eaa0 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
1eab0 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1eac0 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
1ead0 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
1eae0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1eaf0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75  dFunction(db, "u
1eb00 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20  nknown", nFarg, 
1eb10 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
1eb20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1eb30 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
1eb40 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  f->xFinalize!=0 
1eb50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1eb60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1eb70 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
1eb80 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64  tion: %s()", zId
1eb90 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1eba0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1ebb0 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
1ebc0 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
1ebd0 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
1ebe0 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
1ebf0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
1ec00 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
1ec10 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
1ec20 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74  ecessary evaluat
1ec30 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
1ec40 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
1ec50 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
1ec60 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
1ec70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1ec80 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1ec90 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
1eca0 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
1ecb0 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
1ecc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ecd0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ece0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1ecf0 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
1ed00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1ed10 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1ed20 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1ed30 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
1ed40 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
1ed50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1ed60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ed70 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
1ed80 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
1ed90 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ce);.          V
1eda0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1edb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1edc0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1edd0 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
1ede0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
1edf0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ee00 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1ee10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ee20 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1ee30 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
1ee40 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ee50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ee60 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1ee70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ee80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1ee90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
1eea0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
1eeb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1eec0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
1eed0 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e  e UNLIKELY() fun
1eee0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1eef0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
1ef00 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1ef10 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1ef20 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
1ef30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
1ef40 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ef50 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
1ef60 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
1ef70 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31  assert( nFarg>=1
1ef80 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1ef90 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1efa0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1efb0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1efc0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1efd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
1efe0 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
1eff0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1f000 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
1f010 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
1f020 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
1f030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1f040 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b  stcase( i==31 );
1f050 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
1f060 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33  Mask |= MASKBIT3
1f070 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2(i);.        }.
1f080 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1f090 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1f0a0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
1f0b0 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
1f0c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
1f0d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1f0e0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1f0f0 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1f100 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
1f110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f120 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1f130 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b     if( constMask
1f140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31   ){.          r1
1f150 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1f160 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
1f170 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61  rse->nMem += nFa
1f180 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rg;.        }els
1f190 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e{.          r1 
1f1a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1f1b0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
1f1c0 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  arg);.        }.
1f1d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
1f1e0 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70  length() and typ
1f1f0 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  eof() functions 
1f200 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72  with a column ar
1f210 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  gument,.        
1f220 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61  ** set the P5 pa
1f230 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f  rameter to the O
1f240 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
1f250 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  to OPFLAG_LENGTH
1f260 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ARG.        ** o
1f270 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  r OPFLAG_TYPEOFA
1f280 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  RG respectively,
1f290 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
1f2a0 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20  ssary data.     
1f2b0 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20     ** loading.. 
1f2c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f2d0 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
1f2e0 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
1f2f0 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
1f300 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
1f310 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f320 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20    u8 exprOp;.   
1f330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1f340 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
1f350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61       assert( pFa
1f360 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  rg->a[0].pExpr!=
1f370 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  0 );.          e
1f380 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61  xprOp = pFarg->a
1f390 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  [0].pExpr->op;. 
1f3a0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
1f3b0 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  rOp==TK_COLUMN |
1f3c0 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47  | exprOp==TK_AGG
1f3d0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1f3e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
1f3f0 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
1f400 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
1f410 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
1f420 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1f430 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
1f440 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
1f450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
1f460 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
1f470 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41  uncFlags & OPFLA
1f480 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
1f490 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
1f4a0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1f4b0 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 = .           
1f4c0 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e         pDef->fun
1f4d0 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47  cFlags & (OPFLAG
1f4e0 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
1f4f0 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
1f500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f510 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
1f520 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f530 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
1f540 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
1f550 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
1f560 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f570 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1f580 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20   pFarg, r1, 0,. 
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1f5b0 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
1f5c0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1f5d0 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
1f5e0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f5f0 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
1f600 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
1f610 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
1f620 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1f630 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
1f640 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f650 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1f660 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
1f670 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
1f680 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
1f690 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
1f6a0 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
1f6b0 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
1f6c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f6d0 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
1f6e0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
1f6f0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
1f700 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
1f710 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
1f720 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
1f730 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
1f740 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
1f750 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
1f760 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
1f770 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
1f780 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
1f790 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
1f7a0 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
1f7b0 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
1f7c0 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
1f7d0 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
1f7e0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
1f7f0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
1f800 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
1f810 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1f820 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
1f830 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
1f840 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
1f850 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
1f860 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
1f870 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
1f880 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
1f890 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
1f8a0 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
1f8b0 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
1f8c0 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
1f8d0 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
1f8e0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
1f8f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1f900 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
1f910 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1f920 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
1f930 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
1f940 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
1f950 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
1f960 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
1f970 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
1f980 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1f990 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
1f9a0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1f9b0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
1f9c0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
1f9d0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
1f9e0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1f9f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1fa00 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
1fa10 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1fa20 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
1fa30 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1fa40 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1fa50 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
1fa60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fa70 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1fa80 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1fa90 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1faa0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
1fab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fac0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
1fad0 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61  nction0, constMa
1fae0 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1fb10 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
1fb20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fb30 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
1fb40 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
1fb50 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
1fb60 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
1fb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1fb80 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1fb90 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
1fba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fbb0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1fbc0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1fbd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1fbe0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
1fbf0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
1fc00 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
1fc10 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
1fc20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fc30 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
1fc40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fc50 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
1fc60 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53      if( op==TK_S
1fc70 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d  ELECT && (nCol =
1fc80 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1fc90 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1fca0 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
1fcb0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
1fcc0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43  Error(pParse, nC
1fcd0 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ol, 1);.      }e
1fce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1fcf0 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53  urn sqlite3CodeS
1fd00 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1fd10 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
1fd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1fd30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fd40 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
1fd50 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1fd60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
1fd70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
1fd80 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1fd90 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
1fda0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1fdb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fdc0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
1fdd0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1fde0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  n pExpr->pLeft->
1fdf0 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e  iTable + pExpr->
1fe00 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20  iColumn;.    }. 
1fe10 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1fe20 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1fe30 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
1fe40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1fe50 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
1fe60 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
1fe70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1fe80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fe90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1fea0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1feb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fec0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1fed0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
1fee0 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
1fef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ff00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ff10 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1ff20 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
1ff30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ff40 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
1ff50 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1ff60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ff70 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
1ff80 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
1ff90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1ffa0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
1ffb0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
1ffc0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1ffd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ffe0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
1fff0 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
20000 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
20010 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
20020 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
20030 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
20040 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
20050 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
20060 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
20070 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
20080 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
20090 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
200a0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
200b0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
200c0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
200d0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
200e0 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
200f0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
20100 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64   {.      exprCod
20110 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
20120 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
20130 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  0, 0);.      ret
20140 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20150 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50  }.    case TK_SP
20160 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AN:.    case TK_
20170 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61  COLLATE: .    ca
20180 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
20190 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
201a0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
201b0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
201c0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
201d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
201e0 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
201f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
20200 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
20210 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
20220 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
20230 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
20240 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
20250 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
20260 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
20270 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
20280 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
20290 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
202a0 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
202b0 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
202c0 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
202d0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
202e0 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
202f0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
20300 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
20310 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
20320 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
20330 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
20340 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
20350 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
20360 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
20370 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
20380 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
20390 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
203a0 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
203b0 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
203c0 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
203d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
203e0 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
203f0 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
20400 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
20410 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
20420 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
20430 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
20440 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
20450 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
20460 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
20470 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
20480 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
20490 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
204a0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
204b0 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
204c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
204d0 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
204e0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
204f0 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
20500 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
20510 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
20520 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
20530 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
20540 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
20550 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
20560 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
20570 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
20580 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
20590 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
205a0 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
205b0 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
205c0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
205d0 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
205e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
205f0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
20600 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
20610 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
20620 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
20630 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
20640 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
20650 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
20660 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
20670 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
20680 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
20690 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
206a0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
206b0 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
206c0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
206d0 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
206e0 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
206f0 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
20700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
20710 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
20720 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
20730 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
20740 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
20750 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
20760 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
20770 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
20780 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
20790 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
207a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
207b0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
207c0 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
207d0 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
207e0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
207f0 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
20800 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
20810 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
20820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20830 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
20840 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
20850 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
20860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20870 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
20880 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
20890 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
208a0 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20   -> $%d",.      
208b0 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
208c0 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
208d0 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
208e0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
208f0 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
20900 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
20910 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65  ->iColumn].zName
20920 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65  ),.        targe
20930 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66  t.      ));..#if
20940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20950 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
20960 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
20970 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20  column has REAL 
20980 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79  affinity, it may
20990 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
209a0 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  ored as an.     
209b0 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65   ** integer. Use
209c0 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
209d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
209e0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e   is really real.
209f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20a00 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
20a10 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51  R-60985-57662 SQ
20a20 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72  Lite will conver
20a30 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b  t the value back
20a40 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f   to.      ** flo
20a50 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e  ating point when
20a60 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66   extracting it f
20a70 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20  rom the record. 
20a80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
20a90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
20aa0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
20ab0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
20ac0 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
20ad0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
20ae0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
20af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20b00 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
20b10 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
20b20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20b40 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  }..    case TK_V
20b50 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  ECTOR: {.      s
20b60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20b70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
20b80 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
20b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20ba0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
20bb0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
20bc0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
20bd0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
20be0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
20bf0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
20c00 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
20c10 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
20c20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
20c30 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
20c40 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
20c50 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
20c60 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
20c70 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
20c80 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
20c90 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
20ca0 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
20cb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
20cc0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
20cd0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
20ce0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
20cf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
20d00 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
20d10 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
20d20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
20d30 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
20d40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
20d50 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
20d60 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
20d70 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
20d80 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
20d90 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
20da0 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
20db0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
20dc0 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
20dd0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
20de0 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
20df0 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
20e00 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
20e10 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
20e20 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
20e30 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
20e40 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
20e50 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
20e60 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
20e70 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
20e80 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
20e90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20ea0 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
20eb0 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
20ec0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
20ed0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
20ee0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
20ef0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
20f00 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
20f10 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
20f20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
20f30 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
20f40 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
20f50 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
20f60 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
20f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
20f80 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
20f90 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
20fa0 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
20fb0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
20fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
20fd0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
20fe0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
20ff0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
21020 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
21030 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
21040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21060 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21070 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
21080 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
21090 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
210a0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
210b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
210c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
210d0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
210e0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
210f0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
21100 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
21110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21120 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
21130 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
21140 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21160 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
21170 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
21180 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
211a0 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
211b0 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
211c0 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f  B) */.      VVA_
211d0 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65  ONLY( int iCache
211e0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
211f0 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a  iCacheLevel; )..
21200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
21210 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21220 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
21230 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
21240 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
21250 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
21260 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
21270 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
21280 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
21290 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
212a0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
212b0 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
212c0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
212d0 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
212e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
212f0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
21300 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
21310 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
21320 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20   tempX = *pX;.  
21330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21340 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
21350 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
21360 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d  rToRegister(&tem
21370 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  pX, exprCodeVect
21380 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  or(pParse, &temp
21390 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
213a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
213b0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
213c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
213d0 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73  &opCompare, 0, s
213e0 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29  izeof(opCompare)
213f0 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  );.        opCom
21400 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
21410 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
21420 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70  re.pLeft = &temp
21430 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
21440 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
21450 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
21460 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
21470 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
21480 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
21490 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
214a0 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
214b0 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
214c0 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
214d0 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
214e0 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
214f0 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
21500 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
21510 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
21520 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
21530 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
21540 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
21550 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
21560 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
21570 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21580 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
21590 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
215a0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
215b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
215c0 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
215d0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
215e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
215f0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
21600 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
21610 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
21620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21630 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
21640 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
21650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21660 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
21670 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21680 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
21690 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
216a0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
216b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
216c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
216d0 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
216e0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
216f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
21700 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
21710 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
21720 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
21730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21740 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
21750 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
21760 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
21770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21780 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65  eGoto(v, endLabe
21790 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
217a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
217b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
217c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
217d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
217e0 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
217f0 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
21800 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
21810 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21820 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
21830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21840 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
21850 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31  EList->a[nExpr-1
21860 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
21870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21880 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21890 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  arse);.      }el
218a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
218b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
218c0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
218d0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
218e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
218f0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
21900 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
21910 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
21920 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
21930 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
21940 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
21950 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
21960 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
21970 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
21980 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
21990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
219a0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
219b0 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
219c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
219d0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
219e0 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
219f0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
21a00 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
21a10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
21a20 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21a30 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
21a40 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
21a50 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
21a60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
21a70 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
21a80 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
21a90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
21aa0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
21ad0 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
21ae0 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
21af0 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
21b00 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
21b10 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21b20 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
21b30 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
21b40 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
21b50 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
21b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
21b70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21b80 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
21b90 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
21ba0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21bb0 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
21bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21bd0 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
21be0 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
21bf0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
21c00 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
21c10 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
21c20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
21c30 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
21c40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21c50 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
21c60 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
21c70 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
21c80 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
21cb0 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
21cc0 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ken, 0, 0);.    
21cd0 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
21ce0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
21cf0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
21d00 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
21d10 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
21d20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21d30 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
21d40 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
21d50 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
21d60 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65  * Factor out the
21d70 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76   code of the giv
21d80 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
21d90 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
21da0 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
21db0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
21dc0 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
21dd0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
21de0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
21df0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
21e00 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
21e10 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
21e20 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
21e30 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
21e40 72 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a  regDest,      /*
21e50 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
21e60 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
21e70 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62  r */.  u8 reusab
21e80 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  le       /* True
21e90 20 69 66 20 74 68 69 73 20 65 78 70 72 65 73 73   if this express
21ea0 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20  ion is reusable 
21eb0 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
21ec0 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43   *p;.  assert( C
21ed0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
21ee0 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50  rse) );.  p = pP
21ef0 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
21f00 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
21f10 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
21f20 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
21f30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
21f40 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
21f50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b  arse, p, pExpr);
21f60 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
21f70 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
21f80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
21f90 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
21fa0 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
21fb0 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
21fc0 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49  regDest;.     pI
21fd0 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20  tem->reusable = 
21fe0 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  reusable;.  }.  
21ff0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
22000 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pr = p;.}../*.**
22010 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
22020 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
22030 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
22040 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
22050 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
22060 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
22070 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
22080 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
22090 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
220a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
220b0 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
220c0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
220d0 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
220e0 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
220f0 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
22100 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
22110 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
22120 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
22130 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
22140 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
22150 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  o..**.** If pExp
22160 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c  r is a constant,
22170 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
22180 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74  ne might generat
22190 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74  e this.** code t
221a0 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73  o fill the regis
221b0 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ter in the initi
221c0 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f  alization sectio
221d0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
221e0 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64   program, in ord
221f0 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20  er to factor it 
22200 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75  out of the evalu
22210 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  ation loop..*/.i
22220 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
22230 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
22240 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22250 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
22260 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72   int r2;.  pExpr
22270 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
22280 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29  ipCollate(pExpr)
22290 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63  ;.  if( ConstFac
222a0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20  torOk(pParse).  
222b0 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
222c0 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26  K_REGISTER.   &&
222d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
222e0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
222f0 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  xpr).  ){.    Ex
22300 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72  prList *p = pPar
22310 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
22320 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a      int i;.    *
22330 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69  pReg  = 0;.    i
22340 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74  f( p ){.      st
22350 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
22360 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
22370 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c   for(pItem=p->a,
22380 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30   i=p->nExpr; i>0
22390 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b  ; pItem++, i--){
223a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
223b0 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20  em->reusable && 
223c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
223d0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
223e0 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a  pExpr,-1)==0 ){.
223f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
22400 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
22410 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20  ExprReg;.       
22420 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
22430 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72  .    r2 = ++pPar
22440 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
22450 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
22460 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
22470 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  r, r2, 1);.  }el
22480 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d  se{.    int r1 =
22490 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
224a0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
224b0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
224c0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
224d0 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
224e0 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b     if( r2==r1 ){
224f0 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72  .      *pReg = r
22500 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22510 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
22520 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
22530 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52  , r1);.      *pR
22540 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
22550 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
22560 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22570 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
22580 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
22590 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
225a0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
225b0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
225c0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
225d0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
225e0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
225f0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
22600 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
22610 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
22620 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
22630 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
22640 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
22650 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
22660 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
22670 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
22680 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
22690 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
226a0 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
226b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
226c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
226d0 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
226e0 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
226f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
22700 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
22710 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
22720 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
22730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22740 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
22750 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
22760 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
22770 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
22780 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
22790 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
227a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
227b0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
227c0 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
227d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
227e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
227f0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f  e a transient co
22800 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
22810 20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20   pExpr and then 
22820 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a  code it using.**
22830 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22840 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
22850 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  e works just lik
22860 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
22870 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68  e().** except th
22880 61 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  at the input exp
22890 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61  ression is guara
228a0 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68  nteed to be unch
228b0 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
228c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
228d0 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
228e0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
228f0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71  nt target){.  sq
22900 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
22910 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20  se->db;.  pExpr 
22920 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
22930 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
22940 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
22950 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65  cFailed ) sqlite
22960 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
22970 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
22980 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
22990 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
229a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
229b0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
229c0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
229d0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
229e0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
229f0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
22a00 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
22a10 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
22a20 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
22a30 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
22a40 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65  arget.  If the e
22a50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
22a60 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
22a70 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
22a80 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65  t choose to code
22a90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22aa0 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  at initializatio
22ab0 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
22ac0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
22ad0 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20  actorable(Parse 
22ae0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
22af0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
22b00 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
22b10 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26  >okConstFactor &
22b20 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
22b30 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
22b40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22b50 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
22b60 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
22b70 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
22b80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22b90 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
22ba0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
22bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
22bc0 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
22bd0 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
22be0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
22bf0 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
22c00 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
22c10 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
22c20 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
22c30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
22c40 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
22c50 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
22c60 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
22c70 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
22c80 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
22c90 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
22ca0 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
22cb0 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
22cc0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
22cd0 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
22ce0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
22cf0 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
22d00 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
22d10 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
22d20 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
22d30 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
22d40 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
22d50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
22d60 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
22d70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22d80 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
22d90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
22da0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
22db0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
22dc0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
22dd0 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
22de0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
22df0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
22e00 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
22e10 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
22e20 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
22e30 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
22e40 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
22e50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
22e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22e70 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
22e80 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
22e90 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
22ea0 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
22eb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
22ec0 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
22ed0 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
22ee0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
22ef0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
22f00 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
22f10 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
22f20 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
22f30 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
22f40 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
22f50 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
22f60 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  valuated..**.** 
22f70 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
22f80 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
22f90 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
22fa0 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
22fb0 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
22fc0 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
22fd0 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
22fe0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
22ff0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
23000 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
23010 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
23020 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
23030 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
23040 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
23050 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
23060 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
23070 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
23080 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
23090 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
230a0 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
230b0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
230c0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
230d0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
230e0 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
230f0 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
23100 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
23110 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
23120 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  om there..*/.int
23130 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23140 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
23150 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
23160 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23170 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
23180 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
23190 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
231a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
231b0 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
231c0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
231d0 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
231e0 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
231f0 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
23200 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
23210 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
23220 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
23230 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
23240 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
23250 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
23260 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23270 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
23280 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
23290 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
232a0 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
232b0 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
232c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
232d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
232e0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
232f0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
23300 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
23310 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
23320 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
23330 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
23340 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
23350 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
23360 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
23370 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
23380 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
23390 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
233a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
233b0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
233c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
233d0 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
233e0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
233f0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23400 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26  _ECEL_REF)!=0 &&
23410 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78   (j = pItem->u.x
23420 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
23430 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
23440 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
23450 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20  _OMITREF ){.    
23460 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
23470 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   n--;.      }els
23480 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
23490 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
234a0 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
234b0 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
234c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
234d0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
234e0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
234f0 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )!=0 && sqlite3E
23500 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
23510 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
23520 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
23530 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
23540 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b  r, target+i, 0);
23550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23560 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
23570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
23580 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
23590 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
235a0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
235b0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
235c0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
235d0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
235e0 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
235f0 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
23600 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
23610 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
23620 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
23630 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
23640 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
23650 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
23660 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
23670 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
23680 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
23690 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
236a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
236b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
236c0 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
236d0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
236e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
236f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23700 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
23710 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
23720 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
23730 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
23740 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
23750 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
23760 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
23770 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
23780 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
23790 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
237a0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
237b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
237c0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
237d0 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
237e0 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
237f0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
23800 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
23810 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
23830 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
23840 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
23850 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
23860 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
23870 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
23880 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
23890 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
238a0 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
238b0 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
238c0 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
238d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
238e0 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
238f0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
23900 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
23910 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
23920 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
23930 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
23940 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
23950 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
23960 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
23970 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
23980 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
23990 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
239a0 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
239b0 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
239c0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
239d0 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
239e0 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
239f0 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
23a00 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
23a10 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
23a20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
23a30 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
23a40 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72  */.){. Expr expr
23a50 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
23a60 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
23a70 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
23a80 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
23a90 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
23aa0 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
23ab0 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
23ac0 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
23ad0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
23ae0 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
23af0 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
23b00 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
23b10 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
23b20 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
23b30 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73  ster */...  mems
23b40 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c  et(&compLeft, 0,
23b50 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
23b60 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69    memset(&compRi
23b70 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ght, 0, sizeof(E
23b80 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
23b90 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a  &exprAnd, 0, siz
23ba0 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61  eof(Expr));..  a
23bb0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23bc0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23bd0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
23be0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
23bf0 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
23c00 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
23c10 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
23c20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
23c30 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
23c40 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
23c50 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
23c60 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
23c70 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
23c80 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
23c90 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
23ca0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
23cb0 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
23cc0 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
23cd0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
23ce0 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
23cf0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
23d00 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
23d10 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
23d20 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72  ter(&exprX, expr
23d30 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
23d40 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
23d50 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a  ree1));.  if( xJ
23d60 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70  ump ){.    xJump
23d70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
23d80 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
23d90 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
23da0 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65     /* Mark the e
23db0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69  xpression is bei
23dc0 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  ng from the ON o
23dd0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
23de0 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20  f a join.    ** 
23df0 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  so that the sqli
23e00 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
23e10 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  t() routine will
23e20 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
23e30 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  move.    ** it i
23e40 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43  nto the Parse.pC
23e50 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20  onstExpr list.  
23e60 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20  We should use a 
23e70 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73  new bit for this
23e80 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61  ,.    ** for cla
23e90 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
23ea0 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
23eb0 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
23ec0 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a  ield so we.    *
23ed0 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20  * have to reuse 
23ee0 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
23ef0 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f  bit.  Bummer. */
23f00 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73  .    exprX.flags
23f10 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
23f20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
23f30 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
23f40 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
23f50 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
23f60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23f70 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
23f80 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
23f90 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
23fa0 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
23fb0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
23fc0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
23fd0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
23fe0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
23ff0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
24000 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
24010 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
24020 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
24030 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
24040 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
24050 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
24060 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
24070 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
24080 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24090 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
240a0 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
240b0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
240c0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
240d0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
240e0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
240f0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
24100 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
24110 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
24120 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
24130 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
24140 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
24150 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
24160 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24170 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24180 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
24190 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
241a0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
241b0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
241c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
241d0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
241e0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
241f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24200 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ump==0 );.}../*.
24210 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24220 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
24230 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
24240 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
24250 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
24260 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
24270 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
24280 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
24290 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
242a0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
242b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
242c0 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
242d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
242e0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
242f0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
24300 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
24310 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
24320 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
24330 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
24340 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
24350 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
24360 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
24370 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
24380 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
24390 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
243a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
243b0 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
243c0 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
243d0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
243e0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
243f0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
24400 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
24410 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
24420 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
24430 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
24440 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
24450 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
24460 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
24470 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
24480 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
24490 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
244a0 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
244b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
244c0 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
244d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
244e0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
244f0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
24500 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
24510 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
24520 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
24530 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
24540 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
24550 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
24560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
24570 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
24580 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
24590 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
245a0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
245b0 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
245c0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
245d0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
245e0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
245f0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
24600 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
24610 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
24620 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
24630 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
24640 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
24650 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
24660 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
24670 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
24680 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
24690 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
246a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
246b0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
246c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
246d0 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
246e0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
246f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
24700 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
24710 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
24720 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
24730 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
24740 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
24750 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
24760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
24770 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
24780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24790 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
247a0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
247b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
247c0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
247d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
247e0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
247f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
24800 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
24810 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
24820 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
24830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24840 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
24850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24860 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
24870 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
24880 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
24890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
248a0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
248b0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
248c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
248d0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
248e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
248f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
24900 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
24910 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
24920 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
24930 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
24940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24950 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
24960 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
24970 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
24980 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
24990 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
249a0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
249b0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
249c0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
249d0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
249e0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
249f0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
24a00 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
24a10 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
24a20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
24a30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
24a40 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
24a50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
24a60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
24a70 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
24a80 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
24a90 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
24aa0 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
24ab0 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
24ac0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
24ad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
24ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24af0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
24b00 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
24b10 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
24b20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24b30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
24b40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
24b50 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
24b60 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
24b70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
24b80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
24b90 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
24ba0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
24bb0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
24bd0 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
24be0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
24bf0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
24c00 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
24c10 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
24c20 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
24c30 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
24c40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24c50 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
24c60 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
24c70 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
24c80 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
24c90 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
24ca0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
24cb0 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
24cc0 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
24cd0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
24ce0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
24cf0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
24d00 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
24d10 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
24d20 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
24d30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24d40 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
24d50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
24d60 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
24d70 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24d80 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
24d90 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
24da0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
24db0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
24dc0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
24dd0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
24de0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24df0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
24e00 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
24e10 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
24e20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
24e30 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
24e40 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
24e50 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
24e60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
24e70 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
24e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
24e90 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
24ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24eb0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
24ec0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
24ed0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
24ee0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
24ef0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
24f00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
24f10 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
24f20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
24f30 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
24f40 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
24f50 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
24f60 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
24f70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
24f80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24f90 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
24fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24fb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
24fc0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
24fd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24fe0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
24ff0 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
25000 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
25010 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
25020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
25030 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
25040 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25050 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
25060 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
25070 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25080 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
25090 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
250a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
250b0 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
250c0 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  True, jumpIfNull
250d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
250e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
250f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
25100 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
25110 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
25120 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
25130 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25140 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
25150 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
25160 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
25170 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
25180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25190 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
251a0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
251b0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
251c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
251d0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
251e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
251f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25200 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
25210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25220 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
25230 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
25240 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69  lt_expr:.      i
25250 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
25260 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
25270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
25280 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
25290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
252a0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
252b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
252c0 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* No-op */.    
252d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
252e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
252f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
25300 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
25310 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
25320 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25330 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
25340 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
25350 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
25360 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
25370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
25380 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
25390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
253a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
253b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
253c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
253d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
253e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
253f0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
25400 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
25410 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
25420 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
25430 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
25440 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
25450 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
25460 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
25470 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
25480 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
25490 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
254a0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
254b0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
254c0 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
254d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
254e0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
254f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
25500 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
25510 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
25520 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
25530 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
25540 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
25550 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
25560 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
25570 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
25580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
25590 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
255a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
255b0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
255c0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
255d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
255e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
255f0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
25600 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
25610 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
25620 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
25630 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
25640 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
25650 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
25660 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25670 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
25680 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
25690 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
256a0 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
256b0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
256c0 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
256d0 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
256e0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
256f0 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
25700 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
25710 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
25720 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
25730 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
25740 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
25750 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
25760 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
25770 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
25780 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
25790 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
257a0 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
257b0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
257c0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
257d0 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
257e0 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
257f0 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
25800 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
25810 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
25820 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
25830 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
25840 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
25850 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
25860 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
25870 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
25880 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
25890 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
258a0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
258b0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
258c0 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
258d0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
258e0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
258f0 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
25900 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
25910 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
25920 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
25930 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
25940 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
25950 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
25960 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
25970 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
25980 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
25990 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
259a0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
259b0 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
259c0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
259d0 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
259e0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
259f0 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
25a00 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
25a10 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
25a20 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
25a30 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25a40 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
25a50 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
25a60 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
25a70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
25a80 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
25a90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25aa0 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
25ab0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
25ac0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25ad0 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
25ae0 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
25af0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
25b00 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
25b10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25b20 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
25b30 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
25b40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
25b50 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
25b60 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
25b70 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
25b80 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
25b90 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
25ba0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25bb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25bc0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
25bd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25be0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25bf0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
25c00 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
25c10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
25c20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25c30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25c40 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
25c50 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
25c60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
25c70 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
25c80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25c90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
25ca0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
25cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
25cc0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
25cd0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
25ce0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
25cf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25d00 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25d10 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
25d20 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
25d30 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
25d40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25d50 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
25d60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25d70 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25d80 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
25d90 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25da0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
25db0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
25dc0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
25dd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25de0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
25df0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25e00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
25e10 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
25e20 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25e30 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
25e40 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
25e50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
25e60 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
25e70 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
25e80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
25e90 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
25ea0 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
25eb0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
25ec0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
25ed0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25ee0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
25ef0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
25f00 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
25f10 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
25f20 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_EQ;.      jump
25f30 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
25f40 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
25f50 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
25f60 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
25f70 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
25f80 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
25f90 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
25fa0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
25fb0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
25fc0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
25fd0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
25fe0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
25ff0 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
26000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26010 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26020 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
26030 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26040 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26050 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
26060 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
26070 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26080 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26090 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
260a0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
260b0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
260c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
260d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
26100 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26110 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
26120 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
26130 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
26140 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
26150 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
26160 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
26170 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
26180 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
26190 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
261a0 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
261b0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
261c0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
261d0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
261e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
261f0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
26200 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
26210 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26220 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
26230 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26240 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
26250 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
26260 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26270 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
26280 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26290 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
262a0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
262b0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
262c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
262d0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
262e0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
262f0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
26300 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
26310 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26320 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
26330 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26340 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
26350 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
26360 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
26370 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26380 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
26390 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
263a0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
263b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
263c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
263d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
263e0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
263f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26400 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
26410 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
26420 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ULL: {.      r1 
26430 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26440 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26450 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
26460 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
26470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26480 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
26490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
264a0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
264b0 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  );   VdbeCoverag
264c0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
264d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
264e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
264f0 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f  TNULL );  VdbeCo
26500 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26510 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
26520 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
26530 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
26540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26550 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
26560 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
26570 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26580 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
26590 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
265a0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
265b0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  , sqlite3ExprIfF
265c0 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  alse, jumpIfNull
265d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
265e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
265f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26600 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
26610 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
26620 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
26630 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26640 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
26650 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
26660 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26670 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
26680 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
26690 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
266a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
266b0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
266c0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
266d0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
266e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
266f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26700 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
26710 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
26720 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
26730 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
26740 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
26750 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72   .      if( expr
26760 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
26770 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
26780 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
26790 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
267a0 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
267b0 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
267c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  .        /* no-o
267d0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
267e0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
267f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26800 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26810 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
26820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26830 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
26840 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
26850 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
26860 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
26870 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
26880 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
26890 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
268a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
268b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
268c0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
268d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
268e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
268f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26900 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
26910 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
26920 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
26930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73  .}../*.** Like s
26940 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26950 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
26960 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  a copy is made o
26970 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a  f pExpr before.*
26980 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  * code generatio
26990 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79  n, and that copy
269a0 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65   is deleted afte
269b0 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  r code generatio
269c0 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72  n. This.** ensur
269d0 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  es that the orig
269e0 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e  inal pExpr is un
269f0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
26a00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26a10 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50  lseDup(Parse *pP
26a20 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
26a30 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20  r, int dest,int 
26a40 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73  jumpIfNull){.  s
26a50 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
26a60 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
26a70 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33  *pCopy = sqlite3
26a80 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
26a90 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  r, 0);.  if( db-
26aa0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
26ab0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
26ac0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
26ad0 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20  e, pCopy, dest, 
26ae0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
26af0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
26b00 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b  lete(db, pCopy);
26b10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  .}.../*.** Do a 
26b20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
26b30 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
26b40 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
26b50 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
26b60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
26b70 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
26b80 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
26b90 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
26ba0 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
26bb0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
26bc0 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
26bd0 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
26be0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
26bf0 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
26c00 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
26c10 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
26c20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
26c30 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
26c40 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
26c50 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
26c60 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
26c70 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
26c80 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
26c90 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
26ca0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
26cb0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20  b..**.** The pA 
26cc0 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73  side might be us
26cd0 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e  ing TK_REGISTER.
26ce0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
26cf0 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a   case and pB is.
26d00 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f  ** not using TK_
26d10 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20  REGISTER but is 
26d20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61  otherwise equiva
26d30 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c  lent, then still
26d40 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
26d50 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
26d60 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
26d70 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
26d80 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
26d90 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
26da0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
26db0 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
26dc0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
26dd0 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
26de0 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
26df0 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
26e00 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
26e10 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
26e20 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
26e30 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
26e40 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
26e50 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
26e60 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
26e70 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
26e80 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
26e90 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
26ea0 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
26eb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
26ec0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
26ed0 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
26ee0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
26ef0 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
26f00 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
26f10 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
26f20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
26f30 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
26f40 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
26f50 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
26f60 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
26f70 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
26f80 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
26f90 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
26fa0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
26fb0 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
26fc0 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
26fd0 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e  b){.  u32 combin
26fe0 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  edFlags;.  if( p
26ff0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b  A==0 || pB==0 ){
27000 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
27010 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a  pA ? 0 : 2;.  }.
27020 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20    combinedFlags 
27030 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42  = pA->flags | pB
27040 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63  ->flags;.  if( c
27050 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
27060 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
27070 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
27080 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e  &pB->flags&EP_In
27090 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41  tValue)!=0 && pA
270a0 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e  ->u.iValue==pB->
270b0 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  u.iValue ){.    
270c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
270d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
270e0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
270f0 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  !=pB->op ){.    
27100 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pA->op==TK_C
27110 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
27120 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
27130 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62  >pLeft, pB, iTab
27140 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
27150 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
27160 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
27170 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
27180 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
27190 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
271a0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
271b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
271c0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
271d0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
271e0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f  _COLUMN && pA->o
271f0 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
27200 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
27210 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
27220 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
27230 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
27240 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e  ite3StrICmp(pA->
27250 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
27260 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
27270 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
27280 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
27290 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
272a0 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
272b0 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d    return pA->op=
272c0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20  =TK_COLLATE ? 1 
272d0 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  : 2;.    }.  }. 
272e0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
272f0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
27300 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
27310 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
27320 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41  rn 2;.  if( ALWA
27330 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  YS((combinedFlag
27340 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
27350 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )==0) ){.    if(
27360 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
27370 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20   EP_xIsSelect ) 
27380 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
27390 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
273a0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
273b0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
273c0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
273d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
273e0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
273f0 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20  ht, pB->pRight, 
27400 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
27410 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
27420 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
27430 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42  (pA->x.pList, pB
27440 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29  ->x.pList, iTab)
27450 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
27460 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
27470 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
27480 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20  Reduced)==0) && 
27490 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
274a0 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G ){.      if( p
274b0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
274c0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
274d0 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
274e0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
274f0 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
27500 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
27510 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
27520 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
27530 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
27540 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
27550 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
27560 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
27570 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
27580 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
27590 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
275a0 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
275b0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
275c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
275d0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
275e0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
275f0 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
27600 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
27610 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
27620 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
27630 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
27640 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
27650 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27660 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
27670 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
27680 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
27690 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
276a0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
276b0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
276c0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
276d0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
276e0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
276f0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
27700 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
27710 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
27720 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
27730 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
27740 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
27750 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
27760 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
27770 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
27780 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
27790 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
277a0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
277b0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
277c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
277d0 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
277e0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
277f0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
27800 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
27810 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
27820 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
27830 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
27840 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
27850 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
27860 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
27870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
27880 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
27890 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
278a0 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
278b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
278c0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
278d0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
278e0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
278f0 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
27900 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
27910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
27920 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
27930 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
27940 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
27950 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
27960 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
27970 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
27980 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
27990 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
279a0 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
279b0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
279c0 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
279d0 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
279e0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
279f0 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
27a00 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
27a10 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
27a20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
27a30 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
27a40 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
27a50 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
27a60 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
27a70 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
27a80 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
27a90 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
27aa0 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
27ab0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
27ac0 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
27ad0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
27ae0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
27af0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
27b00 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
27b10 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
27b20 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
27b30 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
27b40 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
27b50 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
27b60 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
27b70 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
27b80 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
27b90 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
27ba0 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
27bb0 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
27bc0 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
27bd0 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
27be0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
27bf0 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
27c00 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
27c10 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
27c20 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20  ..**.** When in 
27c30 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61  doubt, return fa
27c40 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  lse.  Returning 
27c50 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20  true might give 
27c60 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  a performance.**
27c70 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52   improvement.  R
27c80 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d  eturning false m
27c90 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72  ight cause a per
27ca0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
27cb0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69  on, but.** it wi
27cc0 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74  ll always give t
27cd0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
27ce0 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61  r and is hence a
27cf0 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69  lways safe..*/.i
27d00 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
27d10 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a  pliesExpr(Expr *
27d20 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20  pE1, Expr *pE2, 
27d30 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28  int iTab){.  if(
27d40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
27d50 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54  are(pE1, pE2, iT
27d60 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
27d70 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
27d80 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
27d90 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
27da0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
27db0 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  E1, pE2->pLeft, 
27dc0 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20  iTab).          
27dd0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
27de0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
27df0 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
27e00 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
27e10 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
27e20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
27e30 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  NOTNULL && pE1->
27e40 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
27e50 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20   pE1->op!=TK_IS 
27e60 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
27e70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
27e80 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c  pCollate(pE1->pL
27e90 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  eft);.    testca
27ea0 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65  se( pX!=pE1->pLe
27eb0 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ft );.    if( sq
27ec0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
27ed0 28 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  (pX, pE2->pLeft,
27ee0 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75   iTab)==0 ) retu
27ef0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
27f00 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
27f10 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
27f20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
27f30 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
27f40 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
27f50 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
27f60 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   if an expressio
27f70 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74  n can be evaluat
27f80 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20  ed by reference 
27f90 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  to the.** index 
27fa0 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61  only, without ha
27fb0 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61  ving to do a sea
27fc0 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72  rch for the corr
27fd0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62  esponding.** tab
27fe0 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49  le entry.  The I
27ff0 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65  dxCover.pIdx fie
28000 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e  ld is the index.
28010 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a    IdxCover.iCur.
28020 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ** is the cursor
28030 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a   for the table..
28040 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76  */.struct IdxCov
28050 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  er {.  Index *pI
28060 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dx;     /* The i
28070 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
28080 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
28090 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
280a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
280b0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
280c0 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ble correspondin
280d0 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a  g to the index *
280e0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  /.};../*.** Chec
280f0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
28100 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73  e are references
28110 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
28120 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72  able .** pWalker
28130 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
28140 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73  Cur can be satis
28150 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  fied using the i
28160 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ndex.** pWalker-
28170 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
28180 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dx..*/.static in
28190 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57  t exprIdxCover(W
281a0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
281b0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
281c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
281d0 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
281e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
281f0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
28200 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73  er->iCur.   && s
28210 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
28220 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  dex(pWalker->u.p
28230 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20  IdxCover->pIdx, 
28240 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c  pExpr->iColumn)<
28250 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  0.  ){.    pWalk
28260 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
28270 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
28280 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ort;.  }.  retur
28290 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
282a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
282b0 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70  ne if an index p
282c0 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74  Idx on table wit
282d0 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f  h cursor iCur co
282e0 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74  ntains will.** t
282f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
28300 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75  xpr.  Return tru
28310 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64  e if the index d
28320 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a  oes cover the.**
28330 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
28340 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78  false if the pEx
28350 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  pr expression re
28360 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63  ferences table c
28370 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61  olumns.** that a
28380 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20  re not found in 
28390 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  the index pIdx..
283a0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63  **.** An index c
283b0 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65  overing an expre
283c0 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ssion means that
283d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
283e0 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61  can be.** evalua
283f0 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74  ted using only t
28400 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74  he index and wit
28410 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c  hout having to l
28420 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72  ookup the.** cor
28430 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
28440 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   entry..*/.int s
28450 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65  qlite3ExprCovere
28460 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72  dByIndex(.  Expr
28470 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
28480 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
28490 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  be tested */.  i
284a0 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
284b0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
284c0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
284d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
284e0 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ble */.  Index *
284f0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
28500 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d  The index that m
28510 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72  ight be used for
28520 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a   coverage */.){.
28530 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
28540 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63  ruct IdxCover xc
28550 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c  ov;.  memset(&w,
28560 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
28570 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43    xcov.iCur = iC
28580 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20  ur;.  xcov.pIdx 
28590 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70  = pIdx;.  w.xExp
285a0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
285b0 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e  IdxCover;.  w.u.
285c0 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f  pIdxCover = &xco
285d0 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  v;.  sqlite3Walk
285e0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
285f0 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f  .  return !w.eCo
28600 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  de;.}.../*.** An
28610 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
28620 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
28630 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
28640 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
28650 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
28660 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
28670 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
28680 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
28690 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
286a0 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
286b0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
286c0 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
286d0 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
286e0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
286f0 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
28700 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
28710 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
28720 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
28730 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
28740 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
28750 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28760 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
28770 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
28780 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
28790 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
287a0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
287b0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
287c0 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
287d0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
287e0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
287f0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
28800 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
28810 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
28820 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
28830 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
28840 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
28850 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
28860 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
28870 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
28880 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
28890 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
288a0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
288b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
288c0 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
288d0 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
288e0 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
288f0 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
28900 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
28910 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
28920 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
28930 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
28940 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
28950 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
28960 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
28970 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
28980 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
28990 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
289a0 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
289b0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
289c0 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
289d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
289e0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
289f0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
28a00 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
28a10 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
28a20 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72  Src;.    int nSr
28a30 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d  c = pSrc ? pSrc-
28a40 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66  >nSrc : 0;.    f
28a50 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
28a60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
28a70 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
28a80 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
28a90 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
28aa0 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20  .    if( i<nSrc 
28ab0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
28ac0 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
28ad0 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
28ae0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
28af0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28b00 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
28b10 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
28b20 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
28b30 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
28b40 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
28b50 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
28b60 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
28b70 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
28b80 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
28b90 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
28ba0 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
28bb0 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
28bc0 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
28bd0 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
28be0 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
28bf0 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
28c00 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
28c10 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
28c20 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
28c30 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
28c40 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
28c50 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
28c60 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
28c70 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
28c80 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
28c90 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
28ca0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
28cb0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
28cc0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
28cd0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
28ce0 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
28cf0 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
28d00 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
28d10 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
28d20 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
28d30 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
28d40 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
28d50 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
28d60 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
28d70 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
28d80 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
28d90 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
28da0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
28db0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
28dc0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
28dd0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
28de0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
28df0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
28e00 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
28e10 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
28e20 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28e30 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
28e40 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
28e50 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
28e60 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
28e70 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
28e80 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
28e90 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
28ea0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
28eb0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
28ec0 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
28ed0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
28ee0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
28ef0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
28f00 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
28f10 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
28f20 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
28f30 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
28f40 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
28f50 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
28f60 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
28f70 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
28f80 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
28f90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28fa0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
28fb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
28fc0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
28fd0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
28fe0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
28ff0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
29000 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
29010 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
29020 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
29030 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
29040 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
29050 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
29060 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
29070 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
29080 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
29090 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
290a0 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
290b0 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
290c0 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
290d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
290e0 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
290f0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
29100 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
29110 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
29120 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
29130 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
29140 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
29150 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
29160 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
29170 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
29180 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
29190 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
291a0 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
291b0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
291c0 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
291d0 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
291e0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
291f0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
29200 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
29210 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
29220 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
29230 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
29240 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
29250 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
29260 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
29270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
29280 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
29290 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
292a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
292b0 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
292c0 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
292d0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
292e0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
292f0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
29300 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
29310 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
29320 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
29330 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29340 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
29350 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
29360 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
29370 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
29380 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
29390 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
293a0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
293b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
293c0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
293d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
293e0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
293f0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
29400 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
29410 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
29420 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
29430 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
29440 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
29450 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
29460 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
29470 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
29480 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
29490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
294a0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
294b0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
294c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
294d0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
294e0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
294f0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
29500 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
29510 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
29520 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
29530 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
29540 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
29550 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
29560 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
29570 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
29580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
29590 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
295a0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
295b0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
295c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
295d0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
295e0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
29600 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
29610 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
29630 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
29640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29650 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
29660 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
29670 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
29680 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
29690 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
296a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
296b0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
296c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
296d0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
296e0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
296f0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
29700 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
29710 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
29720 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
29730 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
29740 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
29750 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
29760 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
29770 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
29780 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
29790 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
297b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
297c0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
297d0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
297e0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
297f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
29800 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
29810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29820 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
29840 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
29850 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
29860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29870 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
29880 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
29890 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
298a0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
298b0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
298c0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
298d0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
298e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
298f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
29900 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
29930 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
29940 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
29950 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
29970 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
29980 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
29990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299a0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
299b0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
299d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
299e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
299f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29a00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29a10 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
29a20 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
29a30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29a40 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
29a50 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
29a60 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
29a70 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
29a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29aa0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
29ab0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
29ac0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
29ad0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
29af0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
29b00 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
29b10 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
29b20 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
29b30 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
29b40 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
29b50 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
29b60 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
29b70 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
29b80 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
29b90 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
29ba0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29bb0 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
29bc0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
29bd0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
29be0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
29bf0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
29c00 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
29c10 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
29c20 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
29c30 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
29c40 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
29c50 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
29c60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
29c70 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
29c80 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
29c90 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
29ca0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
29cb0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
29cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
29cd0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
29ce0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
29cf0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
29d00 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
29d10 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
29d20 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
29d30 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
29d40 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
29d50 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
29d60 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
29d70 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
29d80 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
29d90 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
29da0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
29db0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
29dc0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
29dd0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
29de0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
29df0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
29e00 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
29e10 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
29e20 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
29e30 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
29e40 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
29e50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
29e60 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29e70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
29e80 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31  pExpr, pExpr, -1
29e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
29ea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
29ed0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
29ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
29ef0 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
29f00 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
29f10 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
29f20 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
29f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29f40 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
29f50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
29f60 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
29f70 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
29f80 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
29f90 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
29fa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29fb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
29fc0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
29fd0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
29fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
29ff0 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
2a000 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
2a010 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
2a020 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2a030 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2a040 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
2a050 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
2a060 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a070 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2a080 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
2a090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2a0a0 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
2a0b0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
2a0c0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
2a0f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2a100 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
2a110 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
2a120 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
2a130 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
2a140 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2a150 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2a160 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
2a170 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2a180 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
2a190 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2a1a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a1b0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2a1c0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
2a1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2a1e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
2a200 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
2a210 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
2a220 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
2a230 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
2a240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a250 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2a260 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2a270 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2a280 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2a290 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2a2a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2a2b0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2a2c0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
2a2d0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
2a2e0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
2a2f0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
2a300 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a310 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65  _Prune;.      }e
2a320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
2a330 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2a340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2a360 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
2a370 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
2a380 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2a390 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
2a3a0 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
2a3b0 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
2a3c0 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29  RAMETER(pWalker)
2a3d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2a3e0 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
2a3f0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2a400 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  inue;.}../*.** A
2a410 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
2a420 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
2a430 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2a440 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
2a450 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
2a460 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
2a470 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
2a480 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
2a490 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
2a4a0 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
2a4b0 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
2a4c0 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
2a4d0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
2a4e0 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
2a4f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a500 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a510 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
2a520 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2a530 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
2a540 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
2a550 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
2a560 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2a570 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2a580 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
2a590 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
2a5a0 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
2a5b0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
2a5c0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
2a5d0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2a5e0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2a5f0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2a600 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2a610 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2a620 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
2a630 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
2a640 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
2a650 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2a660 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
2a670 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
2a680 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2a690 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
2a6a0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
2a6b0 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
2a6c0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
2a6d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2a6e0 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
2a6f0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
2a700 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
2a710 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
2a720 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a730 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2a740 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
2a750 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
2a760 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
2a770 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2a780 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
2a790 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2a7a0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
2a7b0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
2a7c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
2a7d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2a7e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a7f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
2a800 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
2a810 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2a820 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
2a830 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
2a840 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
2a850 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
2a860 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
2a870 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
2a880 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2a890 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
2a8a0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
2a8b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
2a8c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a8d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
2a8e0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
2a8f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
2a900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
2a910 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
2a920 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
2a930 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
2a940 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
2a950 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
2a960 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
2a970 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
2a980 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
2a990 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
2a9a0 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  the deallocation
2a9b0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
2a9c0 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  il the column ca
2a9d0 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73  che line that us
2a9e0 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  es.** the regist
2a9f0 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65  er becomes stale
2aa00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2aa10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2aa20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2aa30 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
2aa40 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
2aa50 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
2aa60 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
2aa70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Reg) ){.    int 
2aa80 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43  i;.    struct yC
2aa90 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20  olCache *p;.    
2aaa0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
2aab0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
2aac0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
2aad0 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
2aae0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
2aaf0 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20  =iReg ){.       
2ab00 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b   p->tempReg = 1;
2ab10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
2ab20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ab30 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
2ab40 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
2ab50 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
2ab60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2ab70 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
2ab80 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
2ab90 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
2aba0 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e  registers..*/.in
2abb0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2abc0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2abd0 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
2abe0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
2abf0 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75  ( nReg==1 ) retu
2ac00 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  rn sqlite3GetTem
2ac10 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2ac20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
2ac30 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
2ac40 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
2ac50 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
2ac60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73  .    assert( !us
2ac70 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
2ac80 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
2ac90 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) );.    pParse-
2aca0 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
2acb0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
2acc0 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
2acd0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
2ace0 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
2acf0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
2ad00 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
2ad10 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
2ad20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2ad30 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
2ad40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2ad50 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
2ad60 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2ad70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
2ad80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
2ad90 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72  se, iReg);.    r
2ada0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
2adb0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
2adc0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
2add0 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
2ade0 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
2adf0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
2ae00 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2ae10 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2ae20 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
2ae30 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2ae40 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
2ae50 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
2ae60 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
2ae70 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
2ae80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
2ae90 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2aea0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2aeb0 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
2aec0 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
2aed0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
2aee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61  .}../*.** Valida
2aef0 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f  te that no tempo
2af00 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61  rary register fa
2af10 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72  lls within the r
2af20 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73  ange of.** iFirs
2af30 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
2af40 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ive.  This routi
2af50 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20  ne is only call 
2af60 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65  from within asse
2af70 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
2af80 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ts..*/.#ifdef SQ
2af90 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
2afa0 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
2afb0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2afc0 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20  se, int iFirst, 
2afd0 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  int iLast){.  in
2afe0 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
2aff0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20  e->nRangeReg>0. 
2b000 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2b010 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e  ngeReg+pParse->n
2b020 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20  RangeReg<iLast. 
2b030 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2b040 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20  ngeReg>=iFirst. 
2b050 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
2b060 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
2b070 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d  ; i<pParse->nTem
2b080 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pReg; i++){.    
2b090 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  if( pParse->aTem
2b0a0 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20  pReg[i]>=iFirst 
2b0b0 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  && pParse->aTemp
2b0c0 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b  Reg[i]<=iLast ){
2b0d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2b0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b0f0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
2b100 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2b110 2a 2f 0a                                         */.