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

Artifact cf99b1a327b4eb0a85d59f1c01d82bc2a318c544:


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 20 3d 20 30 3b 0a 20 20 20 20 69 66  ar x = 0;.    if
7c10: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20  ( z[0]=='?' ){. 
7c20: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
7c30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
7c40: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
7c50: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
7c60: 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  r and.      ** u
7c70: 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72  se it as the var
7c80: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
7c90: 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20        i64 i;.   
7ca0: 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d     int bOk = 0==
7cb0: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
7cc0: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
7cd0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7ce0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
7cf0: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b   = x = (ynVar)i;
7d00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7d10: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
7d20: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
7d30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7d40: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7d50: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7d60: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
7d70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7d80: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
7d90: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7da0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
7db0: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
7dc0: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
7dd0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7de0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7df0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
7e00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7e10: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
7e20: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
7e30: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
7e40: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
7e50: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
7e60: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7e70: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
7e80: 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20         x = 0;.  
7e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7ea0: 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29  i>pParse->nVar )
7eb0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
7ec0: 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b  ->nVar = (int)i;
7ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7ee0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c  se{.      /* Wil
7ef0: 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61  dcards like ":aa
7f00: 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40  a", "$aaa" or "@
7f10: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
7f20: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
7f30: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61       ** number a
7f40: 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65  s the prior appe
7f50: 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  arance of the sa
7f60: 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74  me name, or if t
7f70: 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he name.      **
7f80: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
7f90: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
7fa0: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
7fb0: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ble number.     
7fc0: 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20   */.      ynVar 
7fd0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
7fe0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61  ; i<pParse->nzVa
7ff0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
8000: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56   if( pParse->azV
8010: 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28  ar[i] && strcmp(
8020: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d  pParse->azVar[i]
8030: 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,z)==0 ){.      
8040: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
8050: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
8060: 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  i+1;.          b
8070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8090: 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78  ( x==0 ) x = pEx
80a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
80b0: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
80c0: 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nVar);.    }.   
80d0: 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20   if( x>0 ){.    
80e0: 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e    if( x>pParse->
80f0: 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  nzVar ){.       
8100: 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20   char **a;.     
8110: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
8120: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72  Realloc(db, pPar
8130: 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a  se->azVar, x*siz
8140: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
8150: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
8160: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8170: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
8180: 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72  ed ); /* Error r
8190: 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20  eported through 
81a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a  mallocFailed */.
81b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
81c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
81d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
81e0: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
81f0: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
8200: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
8210: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
8220: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
8230: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
8240: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
8250: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
8260: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
8270: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
8280: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8290: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
82a0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
82b0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
82c0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
82d0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
82e0: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
82f0: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
8300: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
8310: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
8320: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8330: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8340: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
8350: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8360: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8370: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
8380: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8390: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
83a0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
83b0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
83c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
83d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
83e0: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
83f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8400: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
8410: 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ;.  /* Sanity ch
8420: 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74  eck: Assert that
8430: 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73   the IntValue is
8440: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66   non-negative if
8450: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
8460: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8470: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
8480: 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75  ntValue) || p->u
8490: 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 23 69  .iValue>=0 );.#i
84a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
84b0: 47 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  G.  if( ExprHasP
84c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4c 65  roperty(p, EP_Le
84d0: 61 66 29 20 26 26 20 21 45 78 70 72 48 61 73 50  af) && !ExprHasP
84e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
84f0: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
8500: 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65 66 74  assert( p->pLeft
8510: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
8520: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
8530: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8540: 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ->x.pSelect==0 )
8550: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
8560: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8570: 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e  rty(p, (EP_Token
8580: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
8590: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70  {.    /* The Exp
85a0: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
85b0: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
85c0: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
85d0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61  .pRight */.    a
85e0: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73  ssert( p->x.pLis
85f0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
8600: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
8610: 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f  p->pLeft && p->o
8620: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p!=TK_SELECT_COL
8630: 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45 78 70  UMN ) sqlite3Exp
8640: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8650: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
8660: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8670: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
8680: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
8690: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
86a0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
86b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
86c0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
86d0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
86e0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
86f0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
8700: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
8710: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
8720: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8730: 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20  p, EP_MemToken) 
8740: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
8750: 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  db, p->u.zToken)
8760: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
8770: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
8780: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
8790: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
87a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
87b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
87c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
87d0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
87e0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
87f0: 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  eteNN(db, p);.}.
8800: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8810: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8820: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
8830: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
8840: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
8850: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
8860: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
8870: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8880: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
8890: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
88a0: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
88b0: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
88c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
88d0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
88e0: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
88f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
8900: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
8910: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
8920: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
8930: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8940: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
8950: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
8960: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
8970: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
8980: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
8990: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
89a0: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
89b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
89c0: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
89d0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
89e0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
89f0: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
8a00: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
8a10: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
8a20: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
8a30: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
8a40: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
8a50: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
8a60: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
8a70: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
8a80: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8a90: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
8aa0: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
8ab0: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
8ac0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8ad0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
8ae0: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
8af0: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
8b00: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
8b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b50: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
8b60: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8b70: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
8b80: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
8b90: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
8ba0: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
8bb0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
8bc0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
8bd0: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
8be0: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
8bf0: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
8c00: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
8c10: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
8c20: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
8c30: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
8c40: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
8c50: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
8c60: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
8c70: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
8c80: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
8c90: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
8ca0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8cb0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
8cc0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
8cd0: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
8ce0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
8cf0: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
8d00: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
8d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
8d20: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
8d30: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
8d40: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
8d50: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
8d60: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
8d70: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
8d80: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
8d90: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
8da0: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
8db0: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
8dc0: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
8dd0: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
8de0: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
8df0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
8e00: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
8e10: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
8e20: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
8e30: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
8e40: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
8e50: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
8e60: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
8e70: 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62  s of teh Expr ob
8e80: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
8e90: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
8ea0: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
8eb0: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
8ec0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
8ed0: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
8ee0: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
8ef0: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
8f00: 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45  ke an EXPRDUP_RE
8f10: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
8f20: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
8f30: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
8f40: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
8f50: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
8f60: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
8f70: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
8f80: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
8f90: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
8fa0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
8fb0: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
8fc0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
8fd0: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
8fe0: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
8ff0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
9000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9010: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9020: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9030: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
9040: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
9050: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9060: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
9070: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
9080: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
9090: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58   */.  assert( EX
90a0: 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66  PR_FULLSIZE<=0xf
90b0: 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ff );.  assert( 
90c0: 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64  (0xfff & (EP_Red
90d0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
90e0: 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  y))==0 );.  if( 
90f0: 30 3d 3d 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  0==flags ){.    
9100: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
9110: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
9120: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9130: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9140: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
9150: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
9160: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9170: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
9180: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
9190: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
91a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
91b0: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
91c0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
91d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
91e0: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
91f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
9200: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
9210: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9220: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
9230: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
9240: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
9250: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9260: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
9270: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
9280: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
9290: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
92a0: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
92b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
92c0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
92d0: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
92e0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
92f0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
9300: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9310: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
9320: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
9330: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
9340: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
9350: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
9360: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9370: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
9380: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
9390: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
93a0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
93b0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
93c0: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
93d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
93e0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
93f0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
9400: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
9410: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
9420: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
9430: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
9440: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
9450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
9460: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
9470: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
9480: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
9490: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
94a0: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
94b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
94c0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
94d0: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
94e0: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
94f0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
9500: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
9510: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
9520: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
9530: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
9540: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
9550: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
9560: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
9570: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
9580: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
9590: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
95a0: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
95b0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
95c0: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
95d0: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
95e0: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
95f0: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
9600: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
9610: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
9620: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
9630: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
9640: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
9650: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
9660: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
9670: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
9680: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
9690: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
96a0: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
96b0: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
96c0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
96d0: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
96e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
96f0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
9700: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
9710: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
9720: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
9730: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
9740: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
9750: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
9760: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
9770: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
9780: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
9790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
97a0: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
97b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
97c0: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
97d0: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
97e0: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
97f0: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
9800: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
9810: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
9820: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
9830: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
9840: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
9850: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
9860: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
9870: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
9880: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
9890: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
98a0: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
98b0: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
98c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
98d0: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
98e0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
98f0: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
9900: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
9910: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
9920: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
9930: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
9940: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
9950: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
9960: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
9970: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
9980: 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a   dupFlags, u8 **
9990: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
99a0: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
99b0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
99c0: 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  eturn */.  u8 *z
99d0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
99e0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
99f0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62   from which to b
9a00: 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74  uild Expr object
9a10: 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63   */.  u32 static
9a20: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45  Flag;       /* E
9a30: 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63  P_Static if spac
9a40: 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66  e not obtained f
9a50: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  rom malloc */.. 
9a60: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9a70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
9a80: 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c  .  assert( dupFl
9a90: 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  ags==0 || dupFla
9aa0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9ab0: 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CE );.  assert( 
9ac0: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64  pzBuffer==0 || d
9ad0: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
9ae0: 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a  _REDUCE );..  /*
9af0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
9b00: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
9b10: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
9b20: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75  e. */.  if( pzBu
9b30: 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c  ffer ){.    zAll
9b40: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
9b50: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9b60: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65   EP_Static;.  }e
9b70: 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  lse{.    zAlloc 
9b80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9b90: 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64  cRawNN(db, duped
9ba0: 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46  ExprSize(p, dupF
9bb0: 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74  lags));.    stat
9bc0: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  icFlag = 0;.  }.
9bd0: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
9be0: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20  )zAlloc;..  if( 
9bf0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53  pNew ){.    /* S
9c00: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
9c10: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
9c20: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
9c30: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
9c40: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
9c50: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
9c60: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
9c70: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
9c80: 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b  .    ** EXPR_TOK
9c90: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
9ca0: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
9cb0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9cc0: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a   consumed.    **
9cd0: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
9ce0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
9cf0: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
9d00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
9d10: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
9d20: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
9d30: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
9d40: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63  dupFlags);.    c
9d50: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
9d60: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
9d70: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74  & 0xfff;.    int
9d80: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28   nToken;.    if(
9d90: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9da0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
9db0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
9dc0: 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e   ){.      nToken
9dd0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9de0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
9df0: 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
9e00: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
9e10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9e20: 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  dupFlags ){.    
9e30: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
9e40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9e50: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
9e60: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
9e70: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
9e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9e90: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
9ea0: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
9eb0: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ze(p);.      mem
9ec0: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9ed0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
9ee0: 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c   nSize<EXPR_FULL
9ef0: 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20  SIZE ){ .       
9f00: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
9f10: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
9f20: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
9f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9f40: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
9f50: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
9f60: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
9f70: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
9f80: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
9f90: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
9fa0: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
9fb0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
9fc0: 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65  tatic|EP_MemToke
9fd0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  n);.    pNew->fl
9fe0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
9ff0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
a000: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
a010: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a020: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
a030: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
a040: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
a050: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
a060: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
a070: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
a080: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
a090: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
a0a0: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
a0b0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  .      memcpy(zT
a0c0: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
a0d0: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
a0e0: 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28  }..    if( 0==((
a0f0: 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66  p->flags|pNew->f
a100: 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65  lags) & (EP_Toke
a110: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
a120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a130: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a140: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a150: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a160: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a170: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a180: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a190: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a1a0: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a1b0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a1c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a1d0: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a1f0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a200: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a210: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a220: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a230: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a240: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a250: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a260: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a270: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a280: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a290: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a2a0: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a2b0: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a2c0: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a2d0: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a2e0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a2f0: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a300: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a310: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a320: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a340: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a350: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a360: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a370: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a380: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a390: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = p->pRight ?.  
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a3c0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a3d0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a3e0: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a3f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75  }.      if( pzBu
a400: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
a410: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
a420: 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  oc;.      }.    
a430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
a440: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a450: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
a460: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
a470: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
a480: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
a490: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
a4a0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a4b0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
a4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a4d0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a4f0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
a500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a510: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a520: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a530: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a540: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
a550: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a560: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
a570: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
a580: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
a590: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
a5a0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
a5b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
a5c0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
a5d0: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
a5e0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
a5f0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
a600: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
a610: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
a620: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a630: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
a640: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
a650: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
a660: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
a670: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
a680: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
a690: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
a6a0: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
a6b0: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
a6c0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
a6d0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
a6e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
a6f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
a700: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
a710: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
a720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a730: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
a740: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
a750: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
a760: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
a770: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
a780: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
a790: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
a7a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a7b0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
a7c0: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
a7d0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
a7e0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
a7f0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
a800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
a810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a820: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
a830: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
a840: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
a850: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a860: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
a870: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
a880: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
a890: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
a8a0: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
a8b0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
a8c0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
a8d0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
a8e0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
a8f0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
a900: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
a910: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
a920: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
a930: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
a940: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
a950: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a960: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
a970: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
a980: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
a990: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
a9a0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
a9b0: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
a9c0: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
a9d0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
a9e0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
a9f0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
aa00: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
aa10: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
aa20: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
aa30: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
aa40: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
aa50: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
aa60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
aa70: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
aa80: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
aa90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
aaa0: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
aab0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
aac0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
aad0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
aae0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
aaf0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
ab00: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
ab10: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
ab20: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
ab30: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
ab40: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
ab50: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
ab60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
ab70: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
ab80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
ab90: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
aba0: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
abb0: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
abc0: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
abd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
abe0: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
abf0: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
ac00: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
ac10: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
ac20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ac30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
ac40: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
ac50: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
ac60: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
ac70: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
ac80: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
ac90: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  m;.  int i;.  as
aca0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
acb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
acc0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
acd0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
ace0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
acf0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
ad00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ad10: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
ad20: 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b   = i = p->nExpr;
ad30: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
ad40: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d  EXPRDUP_REDUCE)=
ad50: 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c  =0 ) for(i=1; i<
ad60: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b  p->nExpr; i+=i){
ad70: 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  }.  pNew->a = pI
ad80: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
ad90: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20  allocRawNN(db,  
ada0: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
adb0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
adc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
add0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
ade0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
adf0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
ae00: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
ae10: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
ae20: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
ae30: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
ae40: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
ae50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
ae60: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
ae70: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
ae80: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
ae90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
aea0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
aeb0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
aec0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
aed0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
aee0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
aef0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
af00: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
af10: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
af20: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
af30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
af40: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
af50: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
af60: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
af70: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
af80: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
af90: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
afa0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
afb0: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
afc0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
afd0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
afe0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
aff0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
b000: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
b010: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
b020: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
b030: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
b040: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
b050: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
b060: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
b070: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
b080: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
b090: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
b0a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b0b0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
b0c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b0d0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
b0e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b0f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
b100: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
b110: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
b120: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
b130: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
b140: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
b150: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
b160: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
b170: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b180: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b190: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
b1a0: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
b1b0: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
b1c0: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
b1d0: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
b1e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b1f0: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65  cRawNN(db, nByte
b200: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b210: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b220: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
b230: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
b240: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
b250: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
b260: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b270: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
b280: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
b290: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
b2a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
b2b0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
b2c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
b2d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b2e0: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
b2f0: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
b300: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
b310: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
b320: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b330: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
b340: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
b350: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b360: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b370: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b380: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
b390: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b3a0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b3b0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
b3c0: 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c  ewItem->fg = pOl
b3d0: 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70  dItem->fg;.    p
b3e0: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
b3f0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
b400: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
b410: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
b420: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72  = pOldItem->addr
b430: 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65  FillSub;.    pNe
b440: 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  wItem->regReturn
b450: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67   = pOldItem->reg
b460: 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  Return;.    if( 
b470: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49  pNewItem->fg.isI
b480: 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
b490: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a    pNewItem->u1.z
b4a0: 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
b4b0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b4c0: 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pOldItem->u1.zIn
b4d0: 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
b4e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49      pNewItem->pI
b4f0: 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  BIndex = pOldIte
b500: 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20  m->pIBIndex;.   
b510: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
b520: 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
b530: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
b540: 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20  1.pFuncArg = .  
b550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b560: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
b570: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  OldItem->u1.pFun
b580: 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  cArg, flags);.  
b590: 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70    }.    pTab = p
b5a0: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
b5b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
b5c0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
b5d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
b5e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
b5f0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
b600: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
b610: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b620: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
b630: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b640: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
b650: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b660: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
b670: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
b680: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
b690: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
b6a0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
b6b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
b6c0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
b6d0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
b6e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
b6f0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
b700: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b710: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
b720: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
b730: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
b740: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b750: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b760: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b770: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b780: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  N(db, sizeof(*pN
b790: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
b7a0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
b7b0: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
b7c0: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
b7d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b7e0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e  ocRawNN(db, p->n
b7f0: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
b800: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
b810: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
b820: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b830: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
b840: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
b850: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
b860: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
b870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
b880: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
b890: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
b8a0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
b8b0: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
b8c0: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
b8d0: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
b8e0: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
b8f0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
b900: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
b910: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
b920: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
b930: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
b940: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
b950: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
b960: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
b970: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
b980: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
b990: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
b9a0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
b9b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
b9c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
b9d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
b9e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b9f0: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
ba00: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
ba10: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
ba20: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
ba30: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
ba40: 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  , *pPrior;.  ass
ba50: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
ba60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ba70: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
ba80: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ba90: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
baa0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
bab0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bac0: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
bad0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bae0: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
baf0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
bb00: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
bb10: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
bb20: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
bb30: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
bb40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bb50: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
bb60: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
bb70: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
bb80: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bb90: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
bba0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
bbb0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
bbc0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
bbd0: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
bbe0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
bbf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
bc00: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
bc10: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
bc20: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
bc30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
bc40: 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69   = pPrior = sqli
bc50: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
bc60: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67   p->pPrior, flag
bc70: 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  s);.  if( pPrior
bc80: 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
bc90: 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
bca0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e  >pNext = 0;.  pN
bcb0: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
bcc0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
bcd0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73  p->pLimit, flags
bce0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
bcf0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
bd00: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
bd10: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  et, flags);.  pN
bd20: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
bd30: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
bd40: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  = 0;.  pNew->sel
bd50: 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
bd60: 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70  ags & ~SF_UsesEp
bd70: 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d  hemeral;.  pNew-
bd80: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
bd90: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
bda0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
bdb0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65   -1;.  pNew->nSe
bdc0: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
bdd0: 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d  lectRow;.  pNew-
bde0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
bdf0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
be00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
be10: 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e  etName(pNew, p->
be20: 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74  zSelName);.  ret
be30: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
be40: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
be50: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
be60: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
be70: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
be80: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
be90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
bea0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
beb0: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
bec0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
bed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
bee0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
bef0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
bf00: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
bf10: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
bf20: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ist..**.** If a 
bf30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
bf40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
bf50: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
bf60: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
bf70: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
bf80: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
bf90: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
bfa0: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
bfb0: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
bfc0: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
bfd0: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
bfe0: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
bff0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c000: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
c010: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c020: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c030: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
c040: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
c050: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
c060: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
c070: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c080: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
c090: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
c0a0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
c0b0: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
c0c0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
c0d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c0e0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
c0f0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
c100: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
c110: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
c120: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c130: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
c140: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
c150: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
c160: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
c170: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
c180: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  r = 0;.    pList
c190: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
c1a0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c1b0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c1c0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ]));.    if( pLi
c1d0: 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20  st->a==0 ) goto 
c1e0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20  no_mem;.  }else 
c1f0: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
c200: 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  r & (pList->nExp
c210: 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r-1))==0 ){.    
c220: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c230: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73  item *a;.    ass
c240: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
c250: 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73  r>0 );.    a = s
c260: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
c270: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  db, pList->a, pL
c280: 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a  ist->nExpr*2*siz
c290: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c2a0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
c2b0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
c2c0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
c2d0: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
c2e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
c2f0: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
c300: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
c310: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c320: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
c330: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
c340: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
c350: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
c360: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
c370: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
c380: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
c390: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
c3a0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
c3b0: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
c3c0: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
c3d0: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
c3e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
c3f0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
c400: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
c410: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
c420: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c430: 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45   pColumns and pE
c440: 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f  xpr form a vecto
c450: 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69  r assignment whi
c460: 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ch is part of th
c470: 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20  e SET.** clause 
c480: 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  of an UPDATE sta
c490: 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68  tement.  Like th
c4a0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
c4b0: 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72   (a,b,c) = (expr
c4c0: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
c4d0: 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29  * Or:    (a,b,c)
c4e0: 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a   = (SELECT x,y,z
c4f0: 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a   FROM ....).**.*
c500: 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20  * For each term 
c510: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73  of the vector as
c520: 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64  signment, append
c530: 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20   new entries to 
c540: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
c550: 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49  n list pList.  I
c560: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
c570: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
c580: 4c 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54  LHS, append.** T
c590: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
c5a0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a  expressions..*/.
c5b0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
c5c0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56  3ExprListAppendV
c5d0: 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  ector(.  Parse *
c5e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c5f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c600: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
c610: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f   *pList,       /
c620: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
c630: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
c640: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64   be NULL */.  Id
c650: 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20  List *pColumns, 
c660: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
c670: 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20  names of LHS of 
c680: 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a  the assignment *
c690: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
c6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
c6b0: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
c6c0: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
c6d0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c6e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
c6f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c700: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69    int n;.  int i
c710: 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
c720: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
c730: 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20  nExpr : 0;.  /* 
c740: 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c  pColumns can onl
c750: 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f  y be NULL due to
c760: 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f   an OOM but an O
c770: 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e  OM will cause an
c780: 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72  .  ** exit prior
c790: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
c7a0: 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a   being invoked *
c7b0: 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
c7c0: 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74  olumns==0) ) got
c7d0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
c7e0: 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78  error;.  if( pEx
c7f0: 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63  pr==0 ) goto vec
c800: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
c810: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45  ;.  n = sqlite3E
c820: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
c830: 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  xpr);.  if( pCol
c840: 75 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a  umns->nId!=n ){.
c850: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c860: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
c870: 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64  columns assigned
c880: 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20   %d values",.   
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20   pColumns->nId, 
c8b0: 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63  n);.    goto vec
c8c0: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
c8d0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
c8e0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
c8f0: 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d  Expr *pSubExpr =
c900: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
c910: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
c920: 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20  e, pExpr, i);.  
c930: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
c940: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c950: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
c960: 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66  SubExpr);.    if
c970: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
c980: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
c990: 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b  nExpr==iFirst+i+
c9a0: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
c9b0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
c9c0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c  -1].zName = pCol
c9d0: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
c9e0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73  ;.      pColumns
c9f0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  ->a[i].zName = 0
ca00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
ca10: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ca20: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 66  SELECT ){.    if
ca30: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
ca40: 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70  ->a[iFirst].pExp
ca50: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
ca60: 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  t( pList->a[iFir
ca70: 73 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  st].pExpr->op==T
ca80: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
ca90: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
caa0: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 2d  a[iFirst].pExpr-
cab0: 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b  >pRight = pExpr;
cac0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 30  .      pExpr = 0
cad0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63  ;.    }.  }..vec
cae0: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
caf0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
cb00: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cb10: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
cb20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
cb30: 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  umns);.  return 
cb40: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
cb50: 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64  Set the sort ord
cb60: 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  er for the last 
cb70: 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67  element on the g
cb80: 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a  iven ExprList..*
cb90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cba0: 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
cbb0: 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  er(ExprList *p, 
cbc0: 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b  int iSortOrder){
cbd0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
cbe0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
cbf0: 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49  SQLITE_SO_UNDEFI
cc00: 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f  NED<0 && SQLITE_
cc10: 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c  SO_ASC>=0 && SQL
cc20: 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b  ITE_SO_DESC>0 );
cc30: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45  .  assert( p->nE
cc40: 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  xpr>0 );.  if( i
cc50: 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20  SortOrder<0 ){. 
cc60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b     assert( p->a[
cc70: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
cc80: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
cc90: 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75  _ASC );.    retu
cca0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70  rn;.  }.  p->a[p
ccb0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
ccc0: 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74  rder = (u8)iSort
ccd0: 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Order;.}../*.** 
cce0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
ccf0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
cd00: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
cd10: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
cd20: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
cd30: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
cd40: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
cd50: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
cd60: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
cd70: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
cd80: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
cd90: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
cda0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
cdb0: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
cdc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cdd0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
cde0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
cdf0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
ce00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ce10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
ce20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ce30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
ce40: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
ce50: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
ce60: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
ce70: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
ce80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ce90: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
cea0: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
ceb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cec0: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
ced0: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
cee0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
cef0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
cf00: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
cf10: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
cf20: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
cf30: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
cf40: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
cf50: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
cf60: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
cf70: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
cf80: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
cf90: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
cfa0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
cfb0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
cfc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
cfd0: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
cfe0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
cff0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
d000: 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33  equote ) sqlite3
d010: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
d020: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
d030: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d040: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
d050: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d060: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d070: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d080: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d090: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d0a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d0b0: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d0c0: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
d0d0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d0e0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
d0f0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d100: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
d110: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d120: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
d130: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
d140: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
d150: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
d160: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d170: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d180: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d190: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
d1a0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d1b0: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
d1c0: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
d1d0: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
d1e0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
d1f0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
d200: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d210: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
d220: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
d230: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
d240: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
d250: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
d260: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
d270: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
d280: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
d290: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d2a0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
d2b0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
d2c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
d2d0: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
d2e0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
d2f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d300: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
d310: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
d320: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
d330: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
d340: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
d380: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
d390: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
d3a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
d3b0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
d3c0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
d3d0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
d3e0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
d3f0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
d400: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
d410: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d420: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
d430: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d440: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d450: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
d460: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
d470: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
d480: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
d490: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
d4a0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
d4b0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
d4c0: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
d4d0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
d4e0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
d4f0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
d500: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
d510: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
d520: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d530: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
d540: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
d550: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
d560: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
d570: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
d580: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
d590: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
d5a0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
d5b0: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
d5c0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
d5d0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
d5e0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
d5f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
d600: 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  em;.  assert( pL
d610: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69  ist->a!=0 || pLi
d620: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a  st->nExpr==0 );.
d630: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
d640: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
d650: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
d660: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
d670: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d680: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
d690: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
d6a0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
d6b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
d6c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
d6d0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d  tem->zSpan);.  }
d6e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d6f0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
d700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d710: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f  db, pList);.}.vo
d720: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
d730: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
d740: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
d750: 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c  pList){.  if( pL
d760: 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65  ist ) exprListDe
d770: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  leteNN(db, pList
d780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
d790: 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f  rn the bitwise-O
d7a0: 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c  R of all Expr.fl
d7b0: 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68  ags fields in th
d7c0: 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c  e given.** ExprL
d7d0: 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ist..*/.u32 sqli
d7e0: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
d7f0: 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20  (const ExprList 
d800: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
d810: 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20  ;.  u32 m = 0;. 
d820: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d830: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d840: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d850: 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  .       Expr *pE
d860: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
d870: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
d880: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
d890: 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20   );.       m |= 
d8a0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20  pExpr->flags;.  
d8b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d8c0: 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   m;.}../*.** The
d8d0: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
d8e0: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
d8f0: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65   used to check e
d900: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a  xpressions to.**
d910: 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65   see if they are
d920: 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20   "constant" for 
d930: 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  some definition 
d940: 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68  of constant.  Th
d950: 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64  e.** Walker.eCod
d960: 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e  e value determin
d970: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22  es the type of "
d980: 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65  constant" we are
d990: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e   looking.** for.
d9a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
d9b0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
d9c0: 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  re used to imple
d9d0: 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ment the followi
d9e0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ng:.**.**     sq
d9f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
da00: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
da10: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
da20: 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20  eCode==1.**     
da30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
da40: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20  stantNotJoin()  
da50: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
da60: 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20  ->eCode==2.**   
da70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54    sqlite3ExprIsT
da80: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20  ableConstant()  
da90: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
daa0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20  er->eCode==3.** 
dab0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
dac0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
dad0: 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61  ion()        pWa
dae0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
daf0: 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c  r 5.**.** In all
db00: 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
db10: 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72  backs set Walker
db20: 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f  .eCode=0 and abo
db30: 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  rt if the expres
db40: 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64  sion.** is found
db50: 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e   to not be a con
db60: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
db70: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
db80: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
db90: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
dba0: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
dbb0: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
dbc0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
dbd0: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
dbe0: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73  r.eCode value is
dbf0: 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a   5 when parsing.
dc00: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  ** an existing s
dc10: 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e  chema and 4 when
dc20: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65   processing a ne
dc30: 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  w statement.  A 
dc40: 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
dc50: 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72  er raises an err
dc60: 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65  or for new state
dc70: 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69  ments, but is si
dc80: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64  lently converted
dc90: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20  .** to NULL for 
dca0: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73  existing schemas
dcb0: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73  .  This allows s
dcc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
dcd0: 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e  les that .** con
dce0: 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72  tain a bound par
dcf0: 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74  ameter because t
dd00: 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74  hey were generat
dd10: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
dd20: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
dd30: 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62  e to be parsed b
dd40: 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
dd50: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f   of SQLite witho
dd60: 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20  ut raising a.** 
dd70: 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61  malformed schema
dd80: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
dd90: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
dda0: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
ddb0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
ddc0: 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66  pExpr){..  /* If
ddd0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
dde0: 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65  is 2 then any te
ddf0: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
de00: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
de10: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
de20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
de30: 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  s of a left join
de40: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
de50: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
de60: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
de70: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
de80: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
de90: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20  er->eCode==2 && 
dea0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
deb0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
dec0: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
ded0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
dee0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
def0: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
df00: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
df10: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
df20: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
df30: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
df40: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
df50: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
df60: 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
df70: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
df80: 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75  4 or 5 or the fu
df90: 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20  nction has the. 
dfa0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e     ** SQLITE_FUN
dfb0: 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f  C_CONST flag. */
dfc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
dfd0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
dfe0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e   pWalker->eCode>
dff0: 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =4 || ExprHasPro
e000: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43  perty(pExpr,EP_C
e010: 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20  onstFunc) ){.   
e020: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e030: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
e040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
e050: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e060: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
e070: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
e080: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e090: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
e0a0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
e0b0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
e0c0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
e0d0: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  GG_COLUMN:.     
e0e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e0f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20  ->op==TK_ID );. 
e100: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e110: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e120: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
e130: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e140: 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
e150: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
e160: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e170: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
e180: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
e190: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20  er->eCode==3 && 
e1a0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
e1b0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29  Walker->u.iCur )
e1c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
e1d0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e1e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e1f0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e200: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
e210: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61  ;.      }.    ca
e230: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
e240: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
e250: 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20  r->eCode==5 ){. 
e260: 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74         /* Silent
e270: 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64  ly convert bound
e280: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
e290: 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f   appear inside o
e2a0: 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20  f CREATE.       
e2b0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69   ** statements i
e2c0: 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20  nto a NULL when 
e2d0: 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41  parsing the CREA
e2e0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78  TE statement tex
e2f0: 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  t out.        **
e300: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
e310: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
e320: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
e330: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
e340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c    }else if( pWal
e350: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b  ker->eCode==4 ){
e360: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f  .        /* A bo
e370: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  und parameter in
e380: 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d   a CREATE statem
e390: 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ent that origina
e3a0: 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  tes from.       
e3b0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70   ** sqlite3_prep
e3c0: 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20  are() causes an 
e3d0: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
e3e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e3f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e400: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
e420: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
e430: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
e440: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e450: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
e460: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
e470: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
e480: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
e490: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e4a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
e4b0: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
e4c0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
e4d0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
e4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e4f0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
e500: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
e510: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
e520: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
e530: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
e540: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e550: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
e560: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e570: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
e580: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74  RC_Abort;.}.stat
e590: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
e5a0: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
e5b0: 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43  initFlag, int iC
e5c0: 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ur){.  Walker w;
e5d0: 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
e5e0: 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
e5f0: 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
e600: 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
e610: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
e620: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
e630: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
e640: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
e650: 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75  stant;.  w.u.iCu
e660: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
e670: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
e680: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
e690: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
e6a0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
e6b0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
e6c0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
e6d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
e6e0: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
e6f0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
e700: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
e710: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
e720: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
e730: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
e740: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
e750: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
e760: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
e770: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
e780: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
e790: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
e7a0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
e7b0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
e7c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
e7d0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
e7e0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
e7f0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
e800: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
e810: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
e820: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
e830: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
e840: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
e850: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
e860: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
e870: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
e880: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
e890: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
e8a0: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
e8b0: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
e8c0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
e8d0: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
e8e0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
e8f0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
e900: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e910: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
e920: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
e930: 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29  IsConst(p, 2, 0)
e940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
e950: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e960: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
e970: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e980: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
e990: 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69  nt.** for any si
e9a0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
e9b0: 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
e9c0: 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65  r iCur.  In othe
e9d0: 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
e9e0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
e9f0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
ea00: 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
ea10: 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20  ic function nor 
ea20: 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68  any.** table oth
ea30: 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f  er than iCur..*/
ea40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
ea50: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
ea60: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75  Expr *p, int iCu
ea70: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  r){.  return exp
ea80: 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69  rIsConst(p, 3, i
ea90: 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Cur);.}../*.** W
eaa0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
eab0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
eac0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
ead0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
eae0: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
eaf0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
eb00: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
eb10: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
eb20: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
eb30: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
eb40: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
eb50: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
eb60: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
eb70: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
eb80: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
eb90: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
eba0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
ebb0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
ebc0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
ebd0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
ebe0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
ebf0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
ec00: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
ec10: 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
ec20: 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
ec30: 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
ec40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
ec50: 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
ec60: 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
ec70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ec80: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
ec90: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
eca0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
ecb0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
ecc0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
ecd0: 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
ece0: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
ecf0: 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
ed00: 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
ed10: 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
ed20: 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
ed30: 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
ed40: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
ed50: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
ed60: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
ed70: 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
ed80: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
ed90: 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
eda0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
edb0: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
edc0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
edd0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
ede0: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
edf0: 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23   w.eCode==0;.}.#
ee00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
ee10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
ee20: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
ee30: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
ee40: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
ee50: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
ee60: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
ee70: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
ee80: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
ee90: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
eea0: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
eeb0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
eec0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
eed0: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
eee0: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
eef0: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
ef00: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
ef10: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
ef20: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
ef30: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
ef40: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
ef50: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
ef60: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20   int rc = 0;..  
ef70: 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  /* If an express
ef80: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
ef90: 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66  r literal that f
efa0: 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20  its in a signed 
efb0: 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65  32-bit.  ** inte
efc0: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50  ger, then the EP
efd0: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77  _IntValue flag w
efe0: 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
eff0: 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61   been set */.  a
f000: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
f010: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e  _INTEGER || (p->
f020: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
f030: 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20  lue)!=0.        
f040: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
f050: 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
f060: 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20  n, &rc)==0 );.. 
f070: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
f080: 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
f090: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
f0a0: 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65  u.iValue;.    re
f0b0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77  turn 1;.  }.  sw
f0c0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
f0d0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
f0e0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
f0f0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
f100: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
f110: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
f120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f130: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
f140: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
f150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
f160: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
f170: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
f180: 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d       assert( v!=
f190: 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20  (-2147483647-1) 
f1a0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  );.        *pVal
f1b0: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
f1c0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
f1d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f1e0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f1f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
f200: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f210: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
f220: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
f230: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
f240: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
f250: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
f260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
f270: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
f280: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f290: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
f2a0: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
f2b0: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
f2c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f2d0: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
f2e0: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
f2f0: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
f300: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
f310: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
f320: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
f330: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
f340: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
f350: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
f360: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
f370: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
f380: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
f390: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
f3a0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
f3b0: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
f3c0: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
f3d0: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
f3e0: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
f3f0: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
f400: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
f410: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
f420: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
f430: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
f440: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
f450: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
f460: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
f470: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
f480: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
f490: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
f4a0: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
f4b0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
f4c0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
f4d0: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
f4e0: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
f4f0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
f500: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
f510: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
f520: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f530: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
f540: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
f550: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
f560: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
f570: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
f580: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73  eturn 0;.    cas
f590: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
f5a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54     assert( p->pT
f5b0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ab!=0 );.      r
f5c0: 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
f5d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42  perty(p, EP_CanB
f5e0: 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20  eNull) ||.      
f5f0: 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75         (p->iColu
f600: 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62  mn>=0 && p->pTab
f610: 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
f620: 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
f630: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
f640: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f660: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
f670: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
f680: 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
f690: 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
f6a0: 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
f6b0: 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
f6c0: 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
f6d0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
f6e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
f6f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f700: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
f710: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
f720: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
f730: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
f740: 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
f750: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
f760: 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
f770: 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
f780: 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
f790: 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
f7a0: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
f7b0: 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
f7c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f7d0: 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
f7e0: 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
f7f0: 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
f800: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
f810: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f820: 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
f830: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
f840: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
f850: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
f860: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
f870: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
f880: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
f890: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
f8a0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
f8b0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
f8c0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
f8d0: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
f8e0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
f8f0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
f900: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
f910: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
f920: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
f930: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
f940: 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
f950: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
f960: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
f970: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
f980: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
f990: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
f9a0: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
f9b0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
f9c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
f9d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f9e0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
f9f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
fa00: 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
fa10: 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
fa20: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
fa30: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
fa40: 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
fa50: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
fa60: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
fa70: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
fa80: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
fa90: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
faa0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
fab0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
fac0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
fad0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
fae0: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
faf0: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
fb00: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
fb10: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
fb20: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
fb30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fb40: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
fb50: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
fb60: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fb70: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
fb80: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
fb90: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fba0: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
fbb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
fbc0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fbd0: 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
fbe0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
fbf0: 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
fc00: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
fc10: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
fc20: 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
fc30: 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
fc40: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
fc50: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
fc60: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fc70: 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
fc80: 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
fc90: 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
fca0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
fcb0: 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
fcc0: 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
fcd0: 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
fce0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
fcf0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
fd00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd10: 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
fd20: 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
fd30: 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
fd40: 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
fd50: 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
fd60: 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
fd70: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
fd80: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
fd90: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
fda0: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
fdb0: 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
fdc0: 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
fdd0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
fde0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
fdf0: 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
fe00: 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
fe10: 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
fe20: 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
fe30: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
fe40: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
fe50: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
fe60: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
fe70: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
fe80: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
fe90: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
fea0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
feb0: 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
fec0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
fed0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
fee0: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
fef0: 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
ff00: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
ff10: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
ff20: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
ff30: 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
ff40: 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
ff50: 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
ff60: 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
ff70: 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
ff80: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
ff90: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
ffa0: 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
ffb0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
ffc0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ffd0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
ffe0: 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10000 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
10010 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  use */.  assert(
10020 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
10030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10040 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e  /* No LIMIT mean
10050 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20  s no OFFSET */. 
10060 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
10070 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10080 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
10090 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
100a0 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  /.  pSrc = p->pS
100b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
100c0 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc!=0 );.  if( p
100d0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
100e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
100f0 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d    /* Single term
10100 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
10110 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  */.  if( pSrc->a
10120 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
10130 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
10140 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ROM is not a sub
10150 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f  query or view */
10160 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
10170 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73  a[0].pTab;.  ass
10180 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
10190 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
101a0 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
101b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
101c0 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
101d0 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
101e0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
101f0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10200 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
10210 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
10220 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
10230 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
10240 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
10250 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45  0 );.  /* All SE
10260 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73  LECT results mus
10270 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f  t be columns. */
10280 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
10290 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
102a0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65  ){.    Expr *pRe
102b0 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
102c0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
102d0 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
102e0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
102f0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
10300 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
10310 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20  a[0].iCursor ); 
10320 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
10330 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
10340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
10350 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10360 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10370 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
10380 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10390 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
103a0 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63  e code that chec
103b0 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ks the left-most
103c0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
103d0 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73   table iCur to s
103e0 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74  ee if.** it cont
103f0 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e  ains any NULL en
10400 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68  tries.  Cause th
10410 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65  e register at re
10420 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73  gHasNull to be s
10430 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e  et.** to a non-N
10440 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75  ULL value if iCu
10450 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  r contains no NU
10460 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69  LLs.  Cause regi
10470 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a  ster regHasNull.
10480 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  ** to be set to 
10490 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e  NULL if iCur con
104a0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
104b0 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
104c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
104d0 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
104e0 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lag(Vdbe *v, int
104f0 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61   iCur, int regHa
10500 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64  sNull){.  int ad
10510 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr1;.  sqlite3Vd
10520 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10530 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61  nteger, 0, regHa
10540 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20  sNull);.  addr1 
10550 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10560 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
10570 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
10580 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
10590 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
105a0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
105b0 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
105c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
105d0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
105e0 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
105f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10600 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
10610 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
10620 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10630 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d  ere(v, addr1);.}
10640 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
10650 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10660 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
10670 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
10680 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
10690 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
106a0 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
106b0 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
106c0 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
106d0 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
106e0 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
106f0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
10700 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
10710 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
10720 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
10730 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
10740 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
10750 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
10760 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
10770 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
10780 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
10790 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
107a0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
107b0 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
107c0 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
107d0 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
107e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
107f0 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
10800 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10810 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
10820 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
10830 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
10840 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
10850 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
10860 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
10870 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
10880 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
10890 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
108a0 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
108b0 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
108c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
108d0 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
108e0 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
108f0 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
10900 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
10910 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
10920 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
10930 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
10940 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
10950 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
10960 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
10970 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
10980 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
10990 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
109a0 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
109b0 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
109c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
109d0 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
109e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
109f0 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
10a00 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
10a10 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
10a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
10a30 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
10a40 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
10a50 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
10a60 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
10a70 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10a80 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
10a90 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
10aa0 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
10ab0 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
10ac0 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
10ad0 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
10ae0 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
10af0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
10b00 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10b10 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
10b20 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
10b30 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
10b40 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
10b50 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
10b60 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
10b70 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
10ba0 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
10bb0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
10bc0 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
10bd0 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
10be0 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
10bf0 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
10c20 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
10c30 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
10c40 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
10c50 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
10c60 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
10c70 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
10c80 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
10c90 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
10ca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10cb0 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63  CT <column1>, <c
10cc0 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20  olumn2>... FROM 
10cd0 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
10ce0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
10cf0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
10d00 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
10d10 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
10d20 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
10d30 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
10d40 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
10d50 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
10d60 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
10d70 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
10d80 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10d90 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
10da0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
10db0 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
10dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
10dd0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
10de0 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
10df0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
10e00 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
10e10 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
10e20 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
10e30 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
10e40 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10e50 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
10e60 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
10e70 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
10e80 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
10e90 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
10ea0 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
10eb0 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
10ec0 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
10ed0 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
10ee0 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
10ef0 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
10f00 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
10f10 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
10f20 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
10f30 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
10f40 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
10f50 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
10f60 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
10f70 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
10f80 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
10f90 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
10fa0 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
10fb0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
10fc0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
10fd0 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
10fe0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
10ff0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
11000 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
11010 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
11020 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
11030 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
11040 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
11050 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
11060 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
11070 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
11080 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
11090 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
110a0 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
110b0 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
110c0 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
110d0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
110e0 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
110f0 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
11100 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
11110 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
11120 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
11130 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
11140 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
11150 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
11160 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
11170 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
11180 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
11190 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
111a0 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
111b0 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
111c0 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
111d0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
111e0 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
111f0 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
11200 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
11210 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
11220 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
11230 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
11240 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
11250 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
11260 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
11270 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
11280 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
11290 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
112a0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
112b0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
112c0 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
112d0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
112e0 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
112f0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
11300 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
11310 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
11320 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
11330 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
11340 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
11350 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
11360 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
11370 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
11380 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
11390 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
113a0 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
113b0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
113c0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
113d0 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
113e0 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
113f0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
11400 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
11410 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
11420 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
11430 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
11440 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
11450 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
11460 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
11470 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
11480 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
11490 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
114a0 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
114b0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
114c0 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
114d0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
114e0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
114f0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
11500 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
11510 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
11520 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
11530 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
11540 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
11550 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
11560 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
11570 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
11580 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
11590 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
115a0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
115b0 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
115c0 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
115d0 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
115e0 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
115f0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
11600 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
11610 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
11620 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
11630 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
11640 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
11650 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
11660 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
11670 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
11680 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
11690 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
116a0 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
116b0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
116c0 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
116d0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
116e0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
116f0 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
11700 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
11710 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
11720 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
11730 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
11740 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
11750 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
11760 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
11770 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
11780 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
11790 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
117a0 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
117b0 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
117c0 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
117d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
117e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
117f0 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
11800 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
11810 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11820 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
11830 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
11840 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20   *pX,           
11850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
11860 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
11870 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  HS) of the IN op
11880 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20  erator */.  u32 
11890 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  inFlags,        
118a0 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44         /* IN_IND
118b0 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52  EX_LOOP, _MEMBER
118c0 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f  SHIP, and/or _NO
118d0 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  OP_OK */.  int *
118e0 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20  prRhsHasNull,   
118f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
11900 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73  r holding NULL s
11910 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65  tatus.  See note
11920 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61  s */.  int *aiMa
11930 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
11940 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
11950 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74  m Index fields t
11960 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a  o RHS fields */.
11970 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
119a0 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
119b0 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
119c0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
119d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
119e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
119f0 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
11a00 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
11a10 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
11a20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
11a30 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
11a40 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
11a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
11a60 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a80 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
11a90 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
11aa0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
11ab0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11ac0 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
11ad0 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
11ae0 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
11af0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
11b00 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
11b10 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
11b20 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
11b30 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  =0;..  /* If the
11b40 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28   RHS of this IN(
11b50 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
11b60 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69   a SELECT, and i
11b70 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20  f it matters .  
11b80 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
11b90 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  t the SELECT res
11ba0 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ult contains NUL
11bb0 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20  L values, check 
11bc0 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
11bd0 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75  not NULL is actu
11be0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69  ally possible (i
11bf0 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f  t may not be, fo
11c00 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a  r example, due .
11c10 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c    ** to NOT NULL
11c20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
11c30 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20  the schema). If 
11c40 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  no NULL values a
11c50 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a  re possible,.  *
11c60 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75  * set prRhsHasNu
11c70 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63  ll to 0 before c
11c80 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20  ontinuing.  */. 
11c90 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
11ca0 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20  l && (pX->flags 
11cb0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
11cc0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
11cd0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11ce0 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65  st = pX->x.pSele
11cf0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
11d00 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
11d10 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11d20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11d30 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
11d40 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
11d50 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  r) ) break;.    
11d60 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c  }.    if( i==pEL
11d70 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
11d80 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c      prRhsHasNull
11d90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
11da0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
11db0 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
11dc0 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
11dd0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
11de0 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
11df0 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
11e00 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
11e10 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
11e20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
11e30 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
11e40 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
11e50 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69   && (p = isCandi
11e60 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29  dateForInOpt(pX)
11e70 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
11e80 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11e90 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
11ea0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
11eb0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
11ec0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
11ef0 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
11f00 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
11f30 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
11f40 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
11f50 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
11f60 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45  List;.    int nE
11f70 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
11f80 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  xpr;..    assert
11f90 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
11fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11fb0 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
11fc0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
11fd0 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
11fe0 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
11ff0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
12000 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
12010 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
12020 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
12030 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12050 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
12060 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
12070 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
12080 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
12090 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64  Tab;..    /* Cod
120a0 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74  e an OP_Transact
120b0 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65  ion and OP_Table
120c0 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e  Lock for <table>
120d0 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  . */.    iDb = s
120e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
120f0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
12100 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
12110 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
12120 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
12130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
12140 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
12150 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
12160 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
12170 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b  ..    assert(v);
12180 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56    /* sqlite3GetV
12190 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73  dbe() has always
121a0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
121b0 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69   called */.    i
121c0 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  f( nExpr==1 && p
121d0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
121e0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
121f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20        /* The "x 
12200 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64  IN (SELECT rowid
12210 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61   FROM table)" ca
12220 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
12230 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
12240 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
12250 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Once);.      Vdb
12260 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
12270 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
12280 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
12290 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
122a0 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
122b0 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
122c0 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
122d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
122e0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
122f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12300 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
12330 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
12340 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
12350 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  y_ok = 1;.      
12360 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a  int i;..      /*
12370 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
12380 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
12390 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
123a0 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20  rform each .    
123b0 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
123c0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
123d0 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65  he affinity of e
123e0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  ach column in ta
123f0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ble.      ** on 
12400 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12410 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
12420 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  it not, it is no
12430 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20  t possible to.  
12440 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69      ** use any i
12450 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20  ndex of the RHS 
12460 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  table.  */.     
12470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
12480 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  r && affinity_ok
12490 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
124a0 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
124b0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
124c0 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
124d0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , i);.        in
124e0 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  t iCol = pEList-
124f0 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[i].pExpr->iCo
12500 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lumn;.        ch
12510 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69  ar idxaff = sqli
12520 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66  te3TableColumnAf
12530 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c  finity(pTab,iCol
12540 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20  ); /* RHS table 
12550 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
12560 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33  cmpaff = sqlite3
12570 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
12580 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20  pLhs, idxaff);. 
12590 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
125a0 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
125b0 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
125c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
125d0 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
125e0 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
125f0 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20   switch( cmpaff 
12600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
12610 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
12620 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  B:.            b
12630 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12640 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
12650 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20  TEXT:.          
12660 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70    /* sqlite3Comp
12670 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e  areAffinity() on
12680 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20  ly returns TEXT 
12690 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  if one side or t
126a0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
126b0 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61  * other has no a
126c0 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20  ffinity and the 
126d0 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45  other side is TE
126e0 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20  XT.  Hence,.    
126f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f          ** the o
12700 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61  nly way for cmpa
12710 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73  ff to be TEXT is
12720 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62   for idxaff to b
12730 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20  e TEXT.         
12740 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68     ** and for th
12750 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48  e term on the LH
12760 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68  S of the IN to h
12770 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e  ave no affinity.
12780 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
12790 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d  assert( idxaff==
127a0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
127b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
127c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
127d0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
127e0 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b       affinity_ok
127f0 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65   = sqlite3IsNume
12800 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61  ricAffinity(idxa
12810 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
12820 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
12830 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b  ( affinity_ok ){
12840 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
12850 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
12860 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69  ng index that wi
12870 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73  ll work for this
12880 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
12890 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
128a0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
128b0 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b  Idx && eType==0;
128c0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
128d0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69  t){.          Bi
128e0 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20  tmask colUsed;  
128f0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f      /* Columns o
12900 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  f the index used
12910 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69   */.          Bi
12920 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20  tmask mCol;     
12930 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
12940 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
12950 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  mn */.          
12960 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
12970 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  n<nExpr ) contin
12980 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
12990 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
129a0 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
129b0 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
129c0 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
129d0 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
129e0 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
129f0 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
12a00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12a10 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
12a20 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
12a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12a40 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
12a50 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
12a60 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12a70 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
12a80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
12a90 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
12aa0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
12ab0 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
12ac0 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
12ad0 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
12ae0 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
12af0 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
12b00 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
12b10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
12b20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
12b30 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
12b40 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
12b50 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
12b60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
12b70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
12b80 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
12b90 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
12ba0 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
12bb0 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
12bc0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
12bd0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
12be0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
12bf0 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
12c00 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
12c10 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
12c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
12c30 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
12c40 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
12c50 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
12c60 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
12c70 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
12c80 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12c90 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
12ca0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
12cb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73   .            as
12cc0 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c  sert( pReq!=0 ||
12cd0 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pRhs->iColumn==
12ce0 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72  XN_ROWID || pPar
12cf0 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20  se->nErr );.    
12d00 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
12d10 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
12d30 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
12d40 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75  [j]!=pRhs->iColu
12d50 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
12d70 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
12d80 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  l[j] );.        
12d90 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d        if( pReq!=
12da0 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
12db0 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
12dc0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
12dd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
12de0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
12df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12e00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
12e10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
12e30 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
12e40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12e50 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49     mCol = MASKBI
12e60 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(j);.          
12e70 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c    if( mCol & col
12e80 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a  Used ) break; /*
12e90 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65   Each column use
12ea0 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20  d only once */. 
12eb0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
12ec0 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20  ed |= mCol;.    
12ed0 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
12ee0 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
12ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12f00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
12f10 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63  t( i==nExpr || c
12f20 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54  olUsed!=(MASKBIT
12f30 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20  (nExpr)-1) );.  
12f40 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55          if( colU
12f50 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed==(MASKBIT(nE
12f60 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20  xpr)-1) ){.     
12f70 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
12f80 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
12f90 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
12fa0 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75   index pIdx is u
12fb0 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  sable */.       
12fc0 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
12fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fe0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
12ff0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13000 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13010 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
13020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13030 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13040 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30 2c 20  _Explain, 0, 0, 
13050 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
13060 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13070 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44 45 58  db, "USING INDEX
13080 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41   %s FOR IN-OPERA
13090 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65  TOR",pIdx->zName
130a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
130b0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 23 65   P4_DYNAMIC);.#e
130c0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
130d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130e0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
130f0 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
13100 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
13110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13120 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
13130 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
13140 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
13150 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
13160 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
13170 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
13180 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
13190 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
131a0 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
131b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  ;.            eT
131c0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
131d0 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
131e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
131f0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
13200 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
13210 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
13220 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
13230 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
13240 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20         i64 mask 
13250 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a  = (1<<nExpr)-1;.
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
13280 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
13290 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20  sUsed, .        
132a0 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
132b0 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
132c0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
132d0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
132e0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
132f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13310 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
13340 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
13350 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
13370 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13380 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13390 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
133a0 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
133b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a    }.        } /*
133c0 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69   End loop over i
133d0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20  ndexes */.      
133e0 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66  } /* End if( aff
133f0 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20  inity_ok ) */.  
13400 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f    } /* End if no
13410 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78  t an rowid index
13420 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61   */.  } /* End a
13430 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
13440 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  ze using an inde
13450 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  x */..  /* If no
13460 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
13470 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
13480 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
13490 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
134a0 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
134b0 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
134c0 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
134d0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
134e0 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
134f0 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
13500 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
13510 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68  ot constant or h
13520 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
13530 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
13540 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
13550 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
13560 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
13570 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
13580 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
13590 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
135a0 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
135b0 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
135c0 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
135d0 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
135e0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
135f0 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
13600 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
13610 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
13620 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
13630 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
13640 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
13650 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
13660 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  OP;.  }..  if( e
13670 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
13680 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
13690 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
136a0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
136b0 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
136c0 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
136d0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
136e0 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
136f0 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
13700 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
13710 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
13720 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
13730 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
13740 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
13750 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
13760 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
13770 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
13780 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
13790 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
137a0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
137b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
137c0 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
137d0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
137e0 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
137f0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
13800 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13810 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
13820 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13830 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
13840 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
13850 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  ull = rMayHaveNu
13860 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
13870 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Mem;.    }.    s
13880 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
13890 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
138a0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
138b0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
138c0 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
138d0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
138e0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
138f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
13900 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
13910 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70    }..  if( aiMap
13920 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
13930 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26  DEX_INDEX_ASC &&
13940 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58   eType!=IN_INDEX
13950 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
13960 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20     int i, n;.   
13970 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
13980 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70  VectorSize(pX->p
13990 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  Left);.    for(i
139a0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69  =0; i<n; i++) ai
139b0 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a  Map[i] = i;.  }.
139c0 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
139d0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
139e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
139f0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67  BQUERY./*.** Arg
13a00 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61  ument pExpr is a
13a10 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e  n (?, ?...) IN(.
13a20 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ..) expression. 
13a30 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
13a40 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
13a50 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65  returns a nul-te
13a60 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
13a70 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
13a80 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  he affinities to
13a90 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63   be used for eac
13aa0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
13ab0 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a  comparison..**.*
13ac0 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
13ad0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
13ae0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
13af0 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  re that the retu
13b00 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69  rned.** string i
13b10 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
13b20 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
13b30 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  DbFree()..*/.sta
13b40 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e  tic char *exprIN
13b50 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
13b60 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
13b70 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  xpr){.  Expr *pL
13b80 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
13b90 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d  ft;.  int nVal =
13ba0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
13bb0 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
13bc0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
13bd0 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73   = (pExpr->flags
13be0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
13bf0 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   ? pExpr->x.pSel
13c00 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20  ect : 0;.  char 
13c10 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74  *zRet;..  assert
13c20 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
13c30 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73  IN );.  zRet = s
13c40 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
13c50 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
13c60 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52  Val+1);.  if( zR
13c70 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
13c80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13c90 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
13ca0 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c    Expr *pA = sql
13cb0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
13cc0 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
13cd0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20 3d  ;.      char a =
13ce0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
13cf0 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20  nity(pA);.      
13d00 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
13d10 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
13d20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
13d30 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d  ffinity(pSelect-
13d40 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
13d50 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d  xpr, a);.      }
13d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52  else{.        zR
13d70 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20  et[i] = a;.     
13d80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65   }.    }.    zRe
13d90 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a  t[nVal] = '\0';.
13da0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
13db0 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  t;.}.#endif..#if
13dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13dd0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
13de0 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20 6f  Load the Parse o
13df0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
13e00 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
13e10 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  nt with an error
13e20 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20   .** message of 
13e30 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
13e40 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
13e50 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
13e60 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f  - expected M".*/
13e70 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
13e80 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50  SubselectError(P
13e90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13ea0 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e  t nActual, int n
13eb0 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74  Expect){.  const
13ec0 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73   char *zFmt = "s
13ed0 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
13ee0 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  s %d columns - e
13ef0 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73  xpected %d";.  s
13f00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13f10 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63  Parse, zFmt, nAc
13f20 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a  tual, nExpect);.
13f30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13f40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
13f50 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
13f60 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
13f70 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
13f80 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72  n, EXISTS,.** or
13f90 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
13fa0 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
13fb0 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
13fc0 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
13fd0 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
13fe0 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
13ff0 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
14000 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
14010 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
14020 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
14030 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
14040 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
14050 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
14060 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
14070 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
14080 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
14090 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
140a0 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
140b0 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
140c0 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
140d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
140e0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
140f0 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
14100 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
14110 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
14120 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
14130 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
14140 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
14150 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
14160 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
14170 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
14180 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
14190 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
141a0 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
141b0 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
141c0 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
141d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
141e0 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
141f0 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
14200 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
14210 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
14220 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
14230 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
14240 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
14250 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49   B-Tree..**.** I
14260 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
14270 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74  s non-zero, that
14280 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14290 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
142a0 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c  IN.** (not a SEL
142b0 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61  ECT or EXISTS) a
142c0 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20  nd that the RHS 
142d0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e  might contains N
142e0 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69  ULLs..** All thi
142f0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69  s routine does i
14300 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  s initialize the
14310 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
14320 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a  by rMayHaveNull.
14330 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c  ** to NULL.  Cal
14340 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  ling routines wi
14350 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
14360 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
14370 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20  gister.** value 
14380 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74  to non-NULL if t
14390 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
143a0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ree..**.** For a
143b0 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
143c0 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
143d0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
143e0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
143f0 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61  * result.  For a
14400 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45   multi-column SE
14410 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c 74  LECT, the result
14420 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
14430 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72  contiguous.** ar
14440 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
14450 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
14460 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 67  value is the reg
14470 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66  ister of the lef
14480 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74  t-most.** result
14490 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e   column.  Return
144a0 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61 74   0 for IN operat
144b0 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
144c0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69  or occurs..*/.#i
144d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
144e0 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
144f0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
14500 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
14510 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
14520 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
14530 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
14540 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
14550 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
14560 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
14570 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48  ator */.  int rH
14580 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20  asNullFlag,     
14590 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
145a0 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
145b0 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
145c0 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
145d0 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
145e0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
145f0 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
14600 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
14610 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79  ){.  int jmpIfDy
14620 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20  namic = -1;     
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
14650 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
14660 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
14690 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
146a0 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
146b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
146c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
146d0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
146e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
146f0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
14700 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
14710 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  The evaluation o
14720 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53 2f  f the IN/EXISTS/
14730 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72  SELECT must be r
14740 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
14750 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
14760 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
14770 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14780 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
14790 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
147a0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
147b0 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
147c0 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
147d0 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
147e0 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
147f0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
14800 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
14810 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
14820 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
14830 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
14840 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
14850 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
14860 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
14870 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
14880 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
14890 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
148a0 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
148b0 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
148c0 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
148d0 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
148e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
148f0 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
14900 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d  {.    jmpIfDynam
14910 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ic = sqlite3Vdbe
14920 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
14930 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
14940 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
14950 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
14960 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
14970 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
14980 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
14990 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
149a0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45  f(pParse->db, "E
149b0 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51  XECUTE %s%s SUBQ
149c0 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
149d0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
149e0 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
149f0 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
14a00 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
14a10 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20  ST":"SCALAR",.  
14a20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e        pParse->iN
14a30 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20  extSelectId.    
14a40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14a50 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
14a60 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
14a70 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
14a80 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
14a90 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
14aa0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
14ab0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
14ac0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
14ad0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
14ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14af0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
14b00 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
14b10 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
14b20 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
14b30 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
14b40 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
14b50 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
14b60 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
14b70 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
14b80 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
14b90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
14ba0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
14bb0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14bc0 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
14bd0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
14be0 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
14bf0 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
14c00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14c10 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
14c20 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
14c30 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
14c40 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
14c50 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
14c60 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
14c70 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
14c80 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
14c90 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
14ca0 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
14cb0 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
14cc0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
14cd0 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
14ce0 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
14cf0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
14d00 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
14d10 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
14d20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14d30 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
14d40 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
14d50 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
14d60 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
14d70 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
14d80 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
14d90 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
14da0 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
14db0 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
14dc0 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
14dd0 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
14de0 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
14df0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  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 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
14e40 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
14e50 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
14e60 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
14e70 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
14e80 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
14e90 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
14ea0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
14eb0 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
14ec0 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
14ed0 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
14ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
14ef0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
14f00 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14f10 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14f20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14f40 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
14f50 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
14f60 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
14f70 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
14f80 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
14f90 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
14fa0 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
14fb0 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
14fc0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
14fd0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
14fe0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
14ff0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
15000 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
15010 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
15020 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
15030 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
15040 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
15050 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
15060 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
15070 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
15080 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
15090 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
150a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
150b0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
150c0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
150d0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
150e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
150f0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
15100 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
15110 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
15120 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15130 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20   LHS and RHS of 
15140 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
15150 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68  do not match, th
15160 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  at.        ** er
15170 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
15180 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
15190 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
151a0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
151b0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
151c0 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  (pEList->nExpr==
151d0 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
151e0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
151f0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  st;.          in
15200 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  t i;.          s
15210 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
15220 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
15230 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
15240 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  le);.          d
15250 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65  est.zAffSdst = e
15260 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
15270 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
15280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15290 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
152a0 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
152b0 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
152c0 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
152d0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
152e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
152f0 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
15300 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
15310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
15320 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
15330 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
15340 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
15350 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
15360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
15370 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15380 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
15390 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
153a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
153b0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
153c0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
153d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
153e0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
153f0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
15400 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
15410 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15430 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
15440 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
15450 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15460 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
15470 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
15480 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
15490 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
154a0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
154b0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
154c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
154d0 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
154e0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
154f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
15500 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
15510 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
15520 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
15530 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
15540 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
15550 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
15560 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
15570 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
15580 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
15590 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
155a0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
155b0 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20  CollSeq(.       
155c0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
155d0 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
155e0 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20  .pExpr.         
155f0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
15600 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15610 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
15620 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
15630 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
15640 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
15650 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
15660 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
15670 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
15680 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
15690 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
156a0 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
156b0 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
156c0 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
156d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
156e0 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
156f0 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
15700 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
15710 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
15720 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
15730 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
15740 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
15750 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
15760 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
15770 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
15780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
15790 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
157a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
157b0 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
157c0 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
157d0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
157e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
157f0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
15800 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
15810 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15820 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
15830 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
15840 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69  3;..        affi
15850 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
15860 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
15870 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
15880 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
15890 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
158a0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
158b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
158c0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
158d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
158e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
158f0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
15900 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
15910 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
15920 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
15930 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
15940 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15950 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eft);.        }.
15960 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
15970 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
15980 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
15990 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
159a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
159b0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
159c0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
159d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
159e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
159f0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
15a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a10 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
15a20 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
15a30 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
15a40 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
15a50 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
15a60 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
15a70 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
15a80 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
15a90 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
15aa0 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
15ab0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
15ac0 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
15ad0 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
15ae0 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
15af0 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
15b00 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
15b10 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
15b20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
15b30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
15b40 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
15b50 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
15b60 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
15b70 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
15b80 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
15b90 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
15ba0 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
15bb0 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
15bc0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
15bd0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
15be0 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
15bf0 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
15c00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
15c10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
15c20 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79  oNoop(v, jmpIfDy
15c30 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20  namic);.        
15c40 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
15c50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
15c60 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
15c70 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
15c80 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
15c90 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
15ca0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
15cb0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
15cc0 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78  wid && sqlite3Ex
15cd0 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c  prIsInteger(pE2,
15ce0 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a   &iValToIns) ){.
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15d00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15d10 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70   OP_InsertInt, p
15d20 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
15d30 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20  , iValToIns);.  
15d40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15d50 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20             r3 = 
15d60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15d70 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
15d80 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
15d90 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
15da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15dc0 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
15dd0 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  nt, r3,.        
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15e00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15e10 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
15e20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
15e30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
15e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e50 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
15e60 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
15e70 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
15e80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15e90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15ea0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15eb0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
15ec0 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
15ed0 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
15ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15ef0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15f00 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
15f10 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
15f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15f30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
15f40 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
15f50 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20  Table, r2);.    
15f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15f90 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15fa0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15fb0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15fc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15fd0 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
15fe0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
15ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16000 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
16010 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
16020 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
16030 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
16040 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16050 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
16060 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
16070 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
16080 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
16090 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28   /* Case 3:    (
160a0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
160b0 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ...).      **   
160c0 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28    or:    EXISTS(
160d0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
160e0 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ...).      **.  
160f0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c      ** For a SEL
16100 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
16110 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76 61  de to put the va
16120 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  lues for all col
16130 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a  umns of.      **
16140 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
16150 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
16160 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
16170 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
16180 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
16190 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
161a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
161b0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
161c0 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20  XISTS, write an 
161d0 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
161e0 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
161f0 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sts).      ** in
16200 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
16210 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
16220 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
16230 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16240 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
16250 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
16260 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
16270 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20  IT 1".  Any .   
16280 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
16290 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61  g limit is disca
162a0 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  rded in place of
162b0 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31   the new LIMIT 1
162c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
162d0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
16300 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
16310 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
16320 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
16350 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
16360 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
16370 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
163a0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
163b0 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
163c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
163d0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
163e0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
163f0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
16400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16410 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
16420 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
16430 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
16440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
16450 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16460 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16470 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
16480 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
16490 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67  lect;.      nReg
164a0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
164b0 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
164c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
164d0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
164e0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
164f0 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
16500 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
16510 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
16520 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
16530 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
16540 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
16550 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16560 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
16570 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
16580 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
16590 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
165a0 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
165b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
165c0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
165d0 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
165e0 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
165f0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
16600 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
16610 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
16620 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16630 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
16640 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
16650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16660 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16670 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
16680 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
16690 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
166a0 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
166b0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
166c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
166d0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
166e0 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
166f0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
16700 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
16710 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
16720 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45  rse->db, TK_INTE
16730 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
16760 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
16770 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
16780 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
16790 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sel->selFlags &=
167a0 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b   ~SF_MultiValue;
167b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
167c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
167d0 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
167e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
167f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16800 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
16810 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
16820 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
16830 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
16840 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16850 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16860 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
16870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
16880 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
16890 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
168a0 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
168b0 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
168c0 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
168d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
168e0 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
168f0 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
16900 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16910 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
16920 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
16930 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16940 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
16950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16960 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
16970 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49  Expr pIn is an I
16980 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
16990 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
169a0 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
169b0 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
169c0 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
169d0 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20  e IN() operator 
169e0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
169f0 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d  ber of .** colum
16a00 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72  ns as the vector
16a10 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c   on the LHS. Or,
16a20 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
16a30 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a  he IN() is not .
16a40 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20  ** a sub-query, 
16a50 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20  that the LHS is 
16a60 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65  a vector of size
16a70 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
16a80 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61  e3ExprCheckIN(Pa
16a90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16aa0 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  r *pIn){.  int n
16ab0 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
16ac0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16ad0 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  In->pLeft);.  if
16ae0 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20  ( (pIn->flags & 
16af0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16b00 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
16b10 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
16b20 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
16b30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16b40 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
16b50 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
16b60 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
16b70 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
16b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
16b90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16ba0 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
16bb0 20 20 20 20 69 66 28 20 28 70 49 6e 2d 3e 70 4c      if( (pIn->pL
16bc0 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
16bd0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
16be0 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16bf0 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16c00 2c 20 6e 56 65 63 74 6f 72 2c 20 31 29 3b 0a 20  , nVector, 1);. 
16c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16c30 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
16c40 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
16c50 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
16c60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16c70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
16c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16c90 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
16ca0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16cb0 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
16cc0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
16cd0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
16ce0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
16cf0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
16d00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
16d10 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
16d20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76  is a scalar or v
16d30 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
16d40 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74  .  The .** right
16d50 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
16d60 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
16d70 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61  zero or more sca
16d80 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61  lar values, or a
16d90 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49  .** subquery.  I
16da0 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73  f the RHS is a s
16db0 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d  ubquery, the num
16dc0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
16dd0 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61  lumns must.** ma
16de0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
16df0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
16e00 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
16e10 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  HS.  If the RHS 
16e20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  is.** a list of 
16e30 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20  values, the LHS 
16e40 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72  must be a scalar
16e50 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20  . .**.** The IN 
16e60 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65  operator is true
16e70 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75   if the LHS valu
16e80 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  e is contained w
16e90 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a  ithin the RHS..*
16ea0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
16eb0 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  false if the LHS
16ec0 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e   is definitely n
16ed0 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ot in the RHS.  
16ee0 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69  The .** result i
16ef0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72  s NULL if the pr
16f00 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48  esence of the LH
16f10 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e  S in the RHS can
16f20 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72  not be .** deter
16f30 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c  mined due to NUL
16f40 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  Ls..**.** This r
16f50 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
16f60 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73   code that jumps
16f70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
16f80 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
16f90 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
16fa0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
16fb0 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
16fc0 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
16fd0 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
16fe0 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
16ff0 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
17000 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
17010 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
17020 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
17030 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
17040 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
17050 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
17060 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72  separate in-oper
17070 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74  ator.md document
17080 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68  ation file in th
17090 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53  e canonical.** S
170a0 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
170b0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
170c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
170d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
170e0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
170f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17100 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
17110 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
17120 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
17130 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
17140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17150 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
17160 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
17170 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
17180 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
17190 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
171a0 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
171b0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
171c0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
171d0 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
171e0 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
171f0 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
17200 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
17210 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
17220 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
17230 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
17240 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
17250 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
17260 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
17270 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
17280 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20  int rLhs;       
17290 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
172a0 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65  r(s) holding the
172b0 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20   LHS values */. 
172c0 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20   int rLhsOrig;  
172d0 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61         /* LHS va
172e0 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65  lues prior to re
172f0 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61  ordering by aiMa
17300 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  p[] */.  Vdbe *v
17310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17320 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
17330 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
17340 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d  /.  int *aiMap =
17350 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70   0;       /* Map
17360 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65   from vector fie
17370 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ld to index colu
17380 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  mn */.  char *zA
17390 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ff = 0;       /*
173a0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
173b0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73   for comparisons
173c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f   */.  int nVecto
173d0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r;          /* S
173e0 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66  ize of vectors f
173f0 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
17400 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75  tor */.  int iDu
17410 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  mmy;           /
17420 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65  * Dummy paramete
17430 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63  r to exprCodeVec
17440 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20  tor() */.  Expr 
17450 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
17460 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
17470 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
17480 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
17490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f            /* loo
174a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
174b0 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20  nt destStep2;   
174c0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
174d0 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73   jump when NULLs
174e0 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20   seen in step 2 
174f0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
17500 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74  p6 = 0;    /* St
17510 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20  art of code for 
17520 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  Step 6 */.  int 
17530 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20  addrTruthOp;    
17540 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17550 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65  opcode that dete
17560 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73  rmines the IN is
17570 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64   true */.  int d
17580 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  estNotNull;     
17590 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
175a0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   a comparison is
175b0 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65   not true in ste
175c0 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
175d0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  rTop;          /
175e0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65  * Top of the ste
175f0 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20  p-6 loop */ ..  
17600 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
17610 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  Left;.  if( sqli
17620 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
17630 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
17640 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d  return;.  zAff =
17650 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
17660 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
17670 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69    nVector = sqli
17680 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
17690 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
176a0 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a  .  aiMap = (int*
176b0 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
176c0 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72  Zero(.      pPar
176d0 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a  se->db, nVector*
176e0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
176f0 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31  izeof(char)) + 1
17700 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  .  );.  if( pPar
17710 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
17720 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69  iled ) goto sqli
17730 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
17740 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41  m_error;..  /* A
17750 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74  ttempt to comput
17760 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72  e the RHS. After
17770 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61   this step, if a
17780 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
17790 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58  an.  ** IN_INDEX
177a0 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
177b0 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65  d, the table ope
177c0 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70  ned ith cursor p
177d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20  Expr->iTable .  
177e0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
177f0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
17800 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20   up the RHS. If 
17810 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
17820 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20   returned,.  ** 
17830 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20  the RHS has not 
17840 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  yet been coded. 
17850 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
17860 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
17870 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
17880 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
17890 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
178a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
178b0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
178c0 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
178d0 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
178e0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
178f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20  pParse, pExpr,. 
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49              IN_I
17920 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
17930 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  | IN_INDEX_NOOP_
17940 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK,.            
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
17970 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26  stIfNull ? 0 : &
17980 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d  rRhsHasNull, aiM
17990 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ap);..  assert( 
179a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
179b0 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
179c0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
179d0 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
179e0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
179f0 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
17a00 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
17a10 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
17a20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17a30 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
17a40 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
17a50 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
17a60 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
17a70 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
17a80 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
17a90 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
17aa0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
17ab0 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
17ac0 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
17ad0 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
17ae0 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
17af0 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
17b00 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
17b10 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
17b20 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
17b30 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
17b40 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
17b50 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
17b60 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
17b70 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
17b80 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
17b90 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
17ba0 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
17bb0 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
17bc0 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
17bd0 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
17be0 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
17bf0 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
17c00 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
17c10 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
17c20 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
17c30 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
17c40 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
17c50 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
17c60 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
17c70 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
17c80 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
17c90 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
17ca0 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
17cb0 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
17cc0 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dex..  */.  sqli
17cd0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
17ce0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73  (pParse);.  rLhs
17cf0 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
17d00 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
17d10 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
17d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
17d30 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
17d40 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
17d50 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
17d60 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
17d70 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
17d80 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
17d90 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
17da0 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
17db0 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
17dc0 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
17dd0 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
17de0 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
17df0 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
17e00 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
17e10 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17e20 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
17e30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17e40 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
17e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17e60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
17e70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
17e80 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
17e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17ea0 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
17eb0 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
17ec0 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
17ed0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
17ee0 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
17ef0 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
17f00 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
17f10 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
17f20 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
17f30 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
17f40 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
17f50 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
17f60 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
17f70 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
17f80 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
17f90 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
17fa0 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
17fb0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17fc0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17fd0 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
17fe0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
17ff0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
18000 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
18010 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
18020 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
18030 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18040 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
18050 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
18060 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
18070 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
18080 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18090 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
180a0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
180b0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
180c0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
180d0 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
180e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
180f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18110 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
18120 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65  , rLhs, rLhs, re
18130 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
18140 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
18150 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
18160 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
18170 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18180 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
18190 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
181a0 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
181b0 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
181c0 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
181d0 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
181e0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
181f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18200 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18210 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
18220 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
18230 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
18240 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
18250 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
18260 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
18270 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
18280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18290 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20  v, OP_Eq, rLhs, 
182a0 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
182d0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
182e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
182f0 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
18300 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
18310 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
18320 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
18330 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
18340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18350 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
18360 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
18370 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
18380 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
18390 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
183a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
183b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
183c0 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66  Ne, rLhs, destIf
183d0 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
18400 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
18410 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18430 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
18440 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45  zAff[0] | SQLITE
18450 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18460 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18470 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18480 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
18490 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
184a0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
184b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
184c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
184d0 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
184e0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
184f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18510 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
18520 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
18530 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18540 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
18550 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
18560 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18570 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
18580 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c  l);.    goto sql
18590 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
185a0 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20  inished;.  }..  
185b0 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b  /* Step 2: Check
185c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
185d0 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  HS contains any 
185e0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49  NULL columns.  I
185f0 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64  f the.  ** LHS d
18600 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  oes contain NULL
18610 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  s then the resul
18620 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
18630 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a   FALSE or NULL..
18640 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65    ** We will the
18650 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72  n skip the binar
18660 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  y search of the 
18670 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
18680 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
18690 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64  IfFalse ){.    d
186a0 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49  estStep2 = destI
186b0 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  fFalse;.  }else{
186c0 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
186d0 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c   destStep6 = sql
186e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
186f0 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  l(v);.  }.  for(
18700 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
18710 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
18720 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
18730 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
18740 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
18750 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
18760 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
18770 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18780 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18790 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c  _IsNull, rLhs+i,
187a0 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20   destStep2);.   
187b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
187c0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
187d0 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65   /* Step 3.  The
187e0 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77   LHS is now know
187f0 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
18800 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79  .  Do the binary
18810 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20   search.  ** of 
18820 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68  the RHS using th
18830 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65  e LHS as a probe
18840 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65  .  If found, the
18850 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20   result is.  ** 
18860 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  true..  */.  if(
18870 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
18880 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
18890 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
188a0 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
188b0 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
188c0 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c  ree and so we al
188d0 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74  so.    ** know t
188e0 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e  hat the RHS is n
188f0 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  on-NULL.  Hence,
18900 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70   we combine step
18910 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a  s 3 and 4.    **
18920 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
18930 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71  pcode. */.    sq
18940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18950 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
18960 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
18970 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68  destIfFalse, rLh
18980 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  s);.    VdbeCove
18990 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
189a0 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74  rTruthOp = sqlit
189b0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
189c0 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65  OP_Goto);  /* Re
189d0 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d  turn True */.  }
189e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
189f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18a00 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73  P_Affinity, rLhs
18a10 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41  , nVector, 0, zA
18a20 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  ff, nVector);.  
18a30 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
18a40 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b  e==destIfNull ){
18a50 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  .      /* Combin
18a60 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65  e Step 3 and Ste
18a70 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  p 5 into a singl
18a80 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
18a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18aa0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
18ab0 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
18ac0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
18ad0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
18af0 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
18b00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18b10 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
18b20 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
18b30 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
18b40 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
18b50 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
18b60 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
18b70 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
18b80 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
18b90 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
18ba0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18bb0 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
18bc0 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20  >iTable, 0,.    
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
18c00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18c10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
18c20 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53  p 4.  If the RHS
18c30 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
18c40 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20  non-NULL and we 
18c50 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a  did not find.  *
18c60 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68  * an match on th
18c70 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20  e search above, 
18c80 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
18c90 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20  must be FALSE.. 
18ca0 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61   */.  if( rRhsHa
18cb0 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72  sNull && nVector
18cc0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
18cd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18ce0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73  OP_NotNull, rRhs
18cf0 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46  HasNull, destIfF
18d00 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43  alse);.    VdbeC
18d10 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
18d20 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49  .  /* Step 5.  I
18d30 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  f we do not care
18d40 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65   about the diffe
18d50 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55  rence between NU
18d60 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53  LL and.  ** FALS
18d70 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  E, then just ret
18d80 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f  urn false. .  */
18d90 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c  .  if( destIfFal
18da0 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
18db0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
18dc0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
18dd0 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20  ;..  /* Step 6: 
18de0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77  Loop through row
18df0 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43  s of the RHS.  C
18e00 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20  ompare each row 
18e10 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a  to the LHS..  **
18e20 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73   If any comparis
18e30 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  on is NULL, then
18e40 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
18e50 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a  ULL.  If all.  *
18e60 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72  * comparisons ar
18e70 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65  e FALSE then the
18e80 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73   final result is
18e90 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a   FALSE..  **.  *
18ea0 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c  * For a scalar L
18eb0 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63  HS, it is suffic
18ec0 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75  ient to check ju
18ed0 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  st the first row
18ee0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
18ef0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
18f00 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33  tStep6 ) sqlite3
18f10 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18f20 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a  (v, destStep6);.
18f30 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
18f40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18f50 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
18f60 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
18f70 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43  fFalse);.  VdbeC
18f80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
18f90 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
18fa0 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
18fb0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18fc0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73  Label(v);.  }els
18fd0 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56  e{.    /* For nV
18fe0 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e  ector==1, combin
18ff0 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20  e steps 6 and 7 
19000 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  by immediately r
19010 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eturning.    ** 
19020 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72  FALSE if the fir
19030 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  st comparison is
19040 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   not NULL */.   
19050 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64   destNotNull = d
19060 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a  estIfFalse;.  }.
19070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
19080 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
19090 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c  Expr *p;.    Col
190a0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
190b0 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65   int r3 = sqlite
190c0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
190d0 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  se);.    p = sql
190e0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
190f0 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
19100 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
19110 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
19120 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
19130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19140 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
19150 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19160 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69  i, r3);.    sqli
19170 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19180 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20   OP_Ne, rLhs+i, 
19190 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c  destNotNull, r3,
191a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
191b0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
191c0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
191d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
191e0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
191f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19200 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
19210 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
19220 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
19230 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
19240 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
19250 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
19260 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
19270 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29  (v, destNotNull)
19280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19290 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
192a0 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  xt, pExpr->iTabl
192b0 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  e, addrTop+1);. 
192c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
192d0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70  v);..    /* Step
192e0 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68   7:  If we reach
192f0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
19300 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
19310 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  sult must.    **
19320 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20   be false. */.  
19330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19340 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19350 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
19360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73  .  }..  /* Jumps
19370 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
19380 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a  o return true. *
19390 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
193a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
193b0 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65  ruthOp);..sqlite
193c0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
193d0 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73  shed:.  if( rLhs
193e0 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c  !=rLhsOrig ) sql
193f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19400 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29  eg(pParse, rLhs)
19410 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
19420 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
19430 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
19440 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
19450 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43  ));.sqlite3ExprC
19460 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a  odeIN_oom_error:
19470 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19480 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d  (pParse->db, aiM
19490 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ap);.  sqlite3Db
194a0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
194b0 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66   zAff);.}.#endif
194c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
194d0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
194e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
194f0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
19500 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
19510 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
19520 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
19530 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
19540 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
19550 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
19560 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
19570 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
19580 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
19590 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
195a0 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
195b0 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
195c0 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
195d0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
195e0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
195f0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
19600 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
19610 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
19620 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
19630 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
19640 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
19650 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
19660 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
19670 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
19680 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
19690 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
196a0 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
196b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
196c0 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
196d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
196e0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
196f0 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
19700 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
19710 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
19720 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
19730 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
19740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19750 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
19760 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
19770 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
19780 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
19790 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
197a0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
197b0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
197c0 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
197d0 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
197e0 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
197f0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
19800 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
19810 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
19820 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
19830 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
19840 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
19850 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
19860 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19870 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
19880 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
19890 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
198a0 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
198b0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
198c0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
198d0 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
198e0 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
198f0 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
19900 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
19910 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
19920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19930 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
19940 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19950 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
19960 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
19970 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
19980 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
19990 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
199a0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
199b0 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
199c0 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
199d0 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
199e0 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
199f0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
19a00 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
19a10 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
19a20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
19a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19a40 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
19a50 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
19a60 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
19a70 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
19a80 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
19a90 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19aa0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
19ab0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19ac0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
19ad0 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
19ae0 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
19af0 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
19b00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19b10 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
19b20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
19b30 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
19b40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19b50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19b60 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
19b70 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
19b80 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
19b90 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
19ba0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
19bb0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
19bc0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
19bd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19be0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  }.}../*.** Erase
19bf0 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e   column-cache en
19c00 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a  try number i.*/.
19c10 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
19c20 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
19c30 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
19c40 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
19c50 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
19c60 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
19c70 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
19c80 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
19c90 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
19ca0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
19cb0 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
19cc0 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
19cd0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
19ce0 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
19cf0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
19d00 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20  lCache--;.  if( 
19d10 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
19d20 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61 72 73  che ){.    pPars
19d30 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20  e->aColCache[i] 
19d40 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
19d50 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  che[pParse->nCol
19d60 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a  Cache];.  }.}...
19d70 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
19d80 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
19d90 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
19da0 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
19db0 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
19dc0 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
19dd0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
19de0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
19df0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19e00 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
19e10 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
19e20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
19e30 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
19e40 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
19e50 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
19e60 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
19e70 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e  ..  /* Unless an
19e80 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
19e90 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75  red, register nu
19ea0 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
19eb0 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20   positive. */.  
19ec0 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c  assert( iReg>0 |
19ed0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
19ee0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
19ef0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19f00 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
19f10 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
19f20 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
19f30 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
19f40 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
19f50 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
19f60 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
19f70 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
19f80 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
19f90 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
19fa0 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
19fb0 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
19fc0 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
19fd0 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
19fe0 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
19ff0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
1a000 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1a010 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
1a020 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1a030 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65  olumnCache) ) re
1a040 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
1a050 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
1a060 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
1a070 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
1a080 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
1a090 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
1a0a0 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
1a0b0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
1a0c0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
1a0d0 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
1a0e0 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
1a0f0 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
1a100 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
1a110 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1a120 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1a130 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1a140 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1a150 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
1a160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1a170 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
1a180 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
1a190 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1a1a0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
1a1b0 65 20 69 73 20 61 6c 72 65 61 64 79 20 66 75 6c  e is already ful
1a1c0 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  l, delete the le
1a1d0 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
1a1e0 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28  d entry */.  if(
1a1f0 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1a200 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  he>=SQLITE_N_COL
1a210 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e  CACHE ){.    min
1a220 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
1a230 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d 20 2d  ;.    idxLru = -
1a240 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  1;.    for(i=0, 
1a250 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1a260 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1a270 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1a280 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1a290 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
1a2a0 20 20 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d          idxLru =
1a2b0 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c   i;.        minL
1a2c0 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
1a2d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1a2e0 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a2f0 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
1a300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
1a310 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1a320 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  he[pParse->nColC
1a330 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20  ache++];.  }..  
1a340 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 65  /* Add the new e
1a350 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e 64 20  ntry to the end 
1a360 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  of the cache */.
1a370 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
1a380 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a390 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  l;.  p->iTable =
1a3a0 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c   iTab;.  p->iCol
1a3b0 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d  umn = iCol;.  p-
1a3c0 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
1a3d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1a3e0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1a3f0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1a400 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1a410 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
1a420 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
1a430 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
1a440 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
1a450 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
1a460 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1a470 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
1a480 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
1a490 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a4a0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
1a4b0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
1a4c0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
1a4d0 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
1a4e0 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1a4f0 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73 74 72  Cache ){.    str
1a500 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1a510 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a520 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66  Cache[i];.    if
1a530 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65  ( p->iReg >= iRe
1a540 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69  g && p->iReg < i
1a550 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  Reg+nReg ){.    
1a560 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1a570 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  r(pParse, i);.  
1a580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1a590 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1a5a0 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
1a5b0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
1a5c0 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
1a5d0 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
1a5e0 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
1a5f0 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
1a600 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
1a610 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
1a620 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
1a630 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
1a640 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
1a650 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a660 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
1a670 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
1a680 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
1a690 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a6a0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1a6b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a6c0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a6d0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1a6e0 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
1a6f0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a700 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1a710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
1a720 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
1a730 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
1a740 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
1a750 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
1a760 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
1a770 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1a780 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
1a790 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1a7a0 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
1a7b0 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
1a7c0 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
1a7d0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1a7e0 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
1a7f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1a800 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
1a810 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1a820 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1a830 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20  >iCacheLevel>=1 
1a840 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  );.  pParse->iCa
1a850 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64  cheLevel--;.#ifd
1a860 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a870 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1a880 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1a890 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1a8a0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
1a8b0 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  OP  to %d\n", pP
1a8c0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a8d0 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  l);.  }.#endif. 
1a8e0 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1a8f0 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1a900 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
1a910 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76  ColCache[i].iLev
1a920 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
1a930 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
1a940 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
1a950 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
1a960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b  }else{.      i++
1a970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a980 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
1a990 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
1a9a0 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
1a9b0 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
1a9c0 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
1a9d0 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
1a9e0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
1a9f0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
1aa00 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
1aa10 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
1aa20 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
1aa30 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
1aa40 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
1aa50 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
1aa60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1aa70 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1aa80 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
1aa90 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1aaa0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1aab0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1aac0 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
1aad0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1aae0 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1aaf0 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1ab00 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1ab10 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1ab20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1ab30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1ab40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ab50 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
1ab60 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
1ab70 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
1ab80 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
1ab90 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
1aba0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1abb0 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
1abc0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1abd0 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
1abe0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1abf0 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
1ac00 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ac10 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
1ac20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1ac30 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
1ac40 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1ac50 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1ac60 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1ac70 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
1ac80 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
1ac90 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
1aca0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1acb0 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
1acc0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1acd0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1ace0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
1acf0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1ad00 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
1ad10 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
1ad20 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
1ad30 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
1ad40 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
1ad50 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1ad60 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
1ad70 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1ad80 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
1ad90 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
1ada0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1adb0 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71   iTabCur;.    sq
1adc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1add0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1ade0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1adf0 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1ae00 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1ae10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ae20 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1ae30 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1ae40 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1ae50 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1ae80 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1ae90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1aea0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1aeb0 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1aec0 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1aed0 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1aee0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1aef0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1af00 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1af10 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1af20 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1af30 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1af40 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1af50 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1af60 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1af70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1af80 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1af90 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1afa0 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1afb0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1afc0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1afd0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1afe0 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1aff0 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1b000 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1b010 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1b020 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1b030 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
1b040 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1b050 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1b060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b070 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1b080 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1b090 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b0a0 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1b0b0 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1b0c0 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1b0d0 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1b0e0 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1b0f0 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1b100 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1b110 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1b120 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1b130 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1b140 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1b150 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1b160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b170 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1b180 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1b190 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1b1a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b1b0 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1b1c0 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1b1d0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1b1e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b1f0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1b200 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1b210 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1b220 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1b230 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1b240 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
1b250 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20  ster. .**.** An 
1b260 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1b270 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
1b280 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
1b290 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73  ster iReg.  This
1b2a0 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e  .** is not garan
1b2b0 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c  teeed for GetCol
1b2c0 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75  umn() - the resu
1b2d0 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  lt can be stored
1b2e0 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73   in.** any regis
1b2f0 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65  ter.  But the re
1b300 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65  sult is guarante
1b310 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65  ed to land in re
1b320 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66  gister iReg.** f
1b330 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  or GetColumnToRe
1b340 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  g()..**.** There
1b350 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1b360 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
1b370 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
1b380 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1b390 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
1b3a0 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
1b3b0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
1b3c0 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
1b3d0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
1b3e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1b3f0 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
1b400 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1b410 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1b420 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1b430 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1b440 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1b450 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1b460 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1b470 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1b480 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1b490 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1b4a0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1b4b0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b4c0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1b4d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1b4e0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1b4f0 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
1b500 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1b510 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
1b520 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
1b530 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
1b540 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
1b550 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b560 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1b570 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1b580 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
1b590 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b5a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1b5b0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1b5c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b5d0 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  if( p->iTable==i
1b5e0 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
1b5f0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
1b600 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
1b610 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
1b620 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
1b630 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1b640 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
1b650 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
1b660 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
1b670 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
1b680 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1b690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b6a0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1b6b0 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1b6c0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1b6d0 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1b6e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1b6f0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
1b700 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
1b710 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1b720 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
1b730 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1b740 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1b750 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  eg;.}.void sqlit
1b760 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b770 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73  umnToReg(.  Pars
1b780 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1b790 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1b7a0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1b7b0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1b7c0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1b7d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1b7e0 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1b7f0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1b800 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1b810 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1b820 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1b830 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b840 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1b850 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1b860 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1b870 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
1b880 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1b890 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1b8a0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1b8b0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1b8c0 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75  rse, pTab, iColu
1b8d0 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  mn, iTable, iReg
1b8e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d  , 0);.  if( r1!=
1b8f0 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64  iReg ) sqlite3Vd
1b900 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1b910 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1b920 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a  , r1, iReg);.}..
1b930 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
1b940 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
1b950 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
1b960 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1b970 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
1b980 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  se){.  int i;..#
1b990 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1b9a0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1b9b0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1b9c0 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1b9d0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
1b9e0 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
1b9f0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
1ba00 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1ba10 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
1ba20 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1ba30 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a  ache[i].tempReg.
1ba40 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e       && pParse->
1ba50 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1ba60 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1ba70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Reg).    ){.    
1ba80 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
1ba90 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
1baa0 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65  pReg++] = pParse
1bab0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1bac0 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
1bad0 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1bae0 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  he = 0;.}../*.**
1baf0 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
1bb00 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
1bb10 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
1bb20 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
1bb30 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
1bb40 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
1bb50 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1bb60 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1bb70 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
1bb80 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
1bb90 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
1bba0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
1bbb0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1bbc0 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
1bbd0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
1bbe0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1bbf0 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1bc00 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1bc10 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1bc20 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1bc30 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
1bc40 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1bc50 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
1bc60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bc70 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
1bc80 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1bc90 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
1bca0 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nReg){.  assert(
1bcb0 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
1bcc0 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
1bcd0 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
1bce0 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
1bcf0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
1bd00 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
1bd10 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Reg);.  sqlite3E
1bd20 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1bd30 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52  Parse, iFrom, nR
1bd40 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  eg);.}..#if defi
1bd50 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1bd60 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1bd70 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1bd80 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1bd90 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
1bda0 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
1bdb0 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
1bdc0 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
1bdd0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1bde0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1bdf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1be00 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
1be10 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
1be20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
1be30 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
1be40 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1be50 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1be60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1be70 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1be80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1be90 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1bea0 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
1beb0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1bec0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1bed0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1bee0 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1bef0 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1bf00 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
1bf10 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
1bf20 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
1bf30 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
1bf40 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
1bf50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1bf60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1bf70 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
1bf80 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1bf90 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
1bfa0 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70  ert a scalar exp
1bfb0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1bfc0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65  a TK_REGISTER re
1bfd0 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67  ferencing.** reg
1bfe0 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65  ister iReg.  The
1bff0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1c000 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c  ure that iReg al
1c010 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ready contains.*
1c020 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  * the correct va
1c030 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  lue for the expr
1c040 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1c050 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
1c060 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
1c070 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
1c080 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
1c090 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
1c0a0 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
1c0b0 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
1c0c0 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
1c0d0 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
1c0e0 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   Evaluate an exp
1c0f0 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20  ression (either 
1c100 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
1c110 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29  alar expression)
1c120 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68   and store.** th
1c130 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74  e result in cont
1c140 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72  inguous temporar
1c150 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65  y registers.  Re
1c160 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1c170 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  f.** the first r
1c180 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20  egister used to 
1c190 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1c1a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1c1b0 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1c1c0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1c1d0 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74  porary scalar, t
1c1e0 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
1c1f0 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  * that register 
1c200 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46  number into *piF
1c210 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65  reeable.  If the
1c220 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1c230 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20   register.** is 
1c240 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1c250 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
1c260 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72  sion is a vector
1c270 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65   set *piFreeable
1c280 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  .** to 0..*/.sta
1c290 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
1c2a0 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50  Vector(Parse *pP
1c2b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69  arse, Expr *p, i
1c2c0 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b  nt *piFreeable){
1c2d0 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a  .  int iResult;.
1c2e0 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20    int nResult = 
1c2f0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
1c300 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20  rSize(p);.  if( 
1c310 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20  nResult==1 ){.  
1c320 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1c330 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c340 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65  pParse, p, piFre
1c350 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  eable);.  }else{
1c360 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65  .    *piFreeable
1c370 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
1c380 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
1c390 7b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  {.      iResult 
1c3a0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1c3b0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1c3c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
1c3d0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1c3e0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1c3f0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1c400 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1c410 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1c420 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c430 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1c440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c450 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c460 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1c470 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c  .pExpr, i+iResul
1c480 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1c490 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
1c4a0 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Result;.}.../*.*
1c4b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c4c0 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1c4d0 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
1c4e0 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
1c4f0 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
1c500 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
1c510 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1c520 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
1c530 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
1c540 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
1c550 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
1c560 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
1c570 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
1c580 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
1c590 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
1c5a0 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
1c5b0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1c5c0 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
1c5d0 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
1c5e0 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
1c5f0 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
1c600 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
1c610 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1c620 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
1c630 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1c640 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
1c650 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
1c660 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
1c670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c680 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
1c690 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1c6a0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1c6b0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1c6c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c6d0 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
1c6e0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1c6f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
1c720 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1c730 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
1c740 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
1c750 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
1c760 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
1c770 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1c780 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1c790 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1c7a0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1c7b0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1c7c0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
1c7d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1c7e0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1c7f0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1c800 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
1c810 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
1c820 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
1c830 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
1c840 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c860 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
1c870 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  sion node */.  i
1c880 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73  nt p5 = 0;..  as
1c890 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1c8a0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1c8b0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1c8c0 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
1c8d0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1c8e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1c8f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c900 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
1c910 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1c920 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1c930 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1c940 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1c950 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1c960 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1c970 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1c980 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1c990 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1c9a0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1c9b0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1c9c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1c9d0 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1c9e0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1c9f0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1ca00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ca10 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1ca20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1ca30 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1ca40 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1ca50 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1ca60 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1ca70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ca80 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1ca90 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1caa0 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1cad0 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1cae0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1caf0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1cb00 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1cb10 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1cb20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1cb30 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1cb40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1cb50 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1cb60 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1cb70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1cb80 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1cb90 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
1cba0 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
1cbb0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1cbc0 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1cbd0 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1cbe0 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1cbf0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1cc00 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1cc10 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
1cc20 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
1cc30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cc40 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1cc50 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1cc60 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1cc70 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1cc80 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1cc90 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1cca0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1ccb0 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1ccc0 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1ccd0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1cce0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1ccf0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
1cd00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1cd10 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1cd20 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1cd30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1cd40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1cd70 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1cda0 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1cdb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1cdc0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1cdd0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1cde0 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1cdf0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1ce00 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1ce10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ce20 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1ce30 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1ce40 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1ce50 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ce60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ce70 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ce80 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1ce90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1cea0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ceb0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1cec0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1ced0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1cee0 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1cef0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1cf00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1cf10 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1cf20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1cf30 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1cf40 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1cf50 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1cf60 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1cf70 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1cf80 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1cf90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cfa0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1cfb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1cfc0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1cfd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cfe0 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1cff0 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1d000 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1d010 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d020 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1d030 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1d040 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d050 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d060 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d070 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d080 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1d090 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1d0a0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1d0b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d0c0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d0d0 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1d0e0 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1d0f0 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1d100 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d110 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1d120 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1d130 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d140 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1d150 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1d160 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1d170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d180 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1d190 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1d1a0 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1d1b0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1d1c0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1d1d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d1e0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1d1f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d200 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d210 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1d220 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1d230 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d240 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1d250 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d260 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1d270 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d290 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1d2a0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1d2b0 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1d2c0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1d2d0 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1d2e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d2f0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
1d300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
1d310 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1d320 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
1d330 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
1d340 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
1d350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d360 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
1d370 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
1d380 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
1d390 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
1d3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1d3b0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1d3c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1d3d0 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1d3e0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1d3f0 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Table;.    }.#if
1d400 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d410 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1d420 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1d430 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1d440 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1d450 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1d460 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
1d470 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1d480 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1d490 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1d4a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1d4b0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1d4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d4d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d4e0 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1d4f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1d500 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1d510 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1d520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d530 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
1d540 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d560 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
1d570 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
1d580 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
1d590 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
1d5a0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1d5b0 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
1d5c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d5d0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1d5e0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1d5f0 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
1d600 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
1d610 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1d620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1d630 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1d640 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1d650 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1d660 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1d670 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1d680 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1d690 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1d6a0 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1d6b0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1d6c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1d6d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1d6e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1d6f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1d700 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1d710 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1d720 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1d730 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1d740 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1d750 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1d760 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1d770 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1d780 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1d790 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1d7a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1d7b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d7c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1d7d0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1d7e0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1d7f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d800 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1d810 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1d820 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1d830 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1d840 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1d850 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1d860 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1d870 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1d880 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1d890 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1d8a0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1d8b0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1d8c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1d8d0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1d8e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1d8f0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1d900 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1d910 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1d920 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1d930 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1d940 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1d950 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1d960 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1d970 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1d980 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1d990 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1d9a0 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1d9b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1d9c0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1d9d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1d9e0 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1d9f0 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1da00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1da10 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1da20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1da30 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1da40 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1da50 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1da60 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1da70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1da80 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1da90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1daa0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1dab0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1dac0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1dad0 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1dae0 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1daf0 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1db00 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1db10 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1db20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1db30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1db40 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1db50 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1db60 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1db70 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1db80 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1db90 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1dba0 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1dbb0 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1dbc0 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1dbd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dbe0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1dbf0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1dc00 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1dc10 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1dc20 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1dc30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1dc40 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1dc50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1dc60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1dc70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1dc80 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1dc90 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1dca0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1dcb0 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1dcc0 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1dcd0 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1dce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1dcf0 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1dd00 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1dd10 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1dd20 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1dd30 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1dd40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dd50 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1dd60 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1dd70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1dd80 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1dd90 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1dda0 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1ddb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ddc0 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1ddd0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1dde0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1ddf0 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1de00 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1de10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1de20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1de30 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1de40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1de50 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1de60 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1de70 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1de80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1de90 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1dea0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1deb0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1dec0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ded0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1dee0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1def0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1df00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1df10 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1df20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1df30 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1df40 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1df50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1df60 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1df70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1df80 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1df90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dfa0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1dfb0 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
1dfc0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1dfd0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1dfe0 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1dff0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
1e000 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1e010 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1e020 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1e030 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
1e040 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e050 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  n target;.#ifnde
1e060 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1e070 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1e080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1e090 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1e0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e0b0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e0c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e0d0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e0e0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1e0f0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
1e100 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1e110 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e120 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  et;.#endif.     
1e130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e140 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
1e150 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
1e160 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
1e170 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
1e180 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
1e190 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
1e1a0 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
1e1b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e1c0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
1e1d0 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
1e1e0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1e1f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e200 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e210 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
1e220 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e230 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e240 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
1e250 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
1e260 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e270 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1e280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1e290 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e2a0 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
1e2b0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1e2c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e2d0 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
1e2e0 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
1e2f0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
1e300 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e310 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
1e320 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
1e330 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1e340 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e360 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e370 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e380 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1e390 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e3a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e3b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1e3c0 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
1e3d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e3e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1e3f0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1e400 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1e410 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
1e420 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
1e430 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
1e440 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1e450 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1e460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e470 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
1e480 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
1e490 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1e4a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e4b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e4c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
1e4d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
1e4e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e4f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e500 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e510 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1e520 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
1e540 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1e550 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
1e560 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1e570 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1e580 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
1e590 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e5a0 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
1e5b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e5c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e5d0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
1e5e0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
1e5f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1e600 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
1e610 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e620 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1e630 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
1e640 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
1e650 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1e660 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
1e670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1e680 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e690 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e6a0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e6b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1e6c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e6d0 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
1e6e0 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
1e6f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1e700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e710 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d     return pInfo-
1e720 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1e730 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1e740 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1e750 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e760 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1e770 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1e780 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1e790 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1e7a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1e7b0 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1e7c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e7d0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1e7e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1e7f0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1e800 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1e810 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1e820 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1e830 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e840 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1e850 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1e860 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1e870 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1e880 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1e890 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1e8a0 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1e8b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e8d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1e8e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  /.      sqlite3 
1e8f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e900 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
1e910 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1e920 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
1e930 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
1e940 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
1e950 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
1e960 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1e970 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1e980 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
1e990 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1e9a0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
1e9b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e9c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1e9d0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1e9e0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1e9f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ea00 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
1ea10 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
1ea20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ea30 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
1ea40 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1ea50 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
1ea60 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
1ea70 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
1ea80 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ea90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1eaa0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1eab0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
1eac0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1ead0 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
1eae0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1eaf0 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
1eb00 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
1eb10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1eb20 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
1eb30 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
1eb40 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
1eb50 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1eb60 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1eb70 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
1eb80 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
1eb90 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
1eba0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1ebb0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1ebc0 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
1ebd0 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
1ebe0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ebf0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1ec00 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
1ec10 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
1ec20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ec30 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
1ec40 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
1ec50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1ec60 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
1ec70 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
1ec80 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
1ec90 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
1eca0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
1ecb0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
1ecc0 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
1ecd0 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
1ece0 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
1ecf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ed00 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1ed10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1ed20 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
1ed30 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
1ed40 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
1ed50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ed60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1ed70 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
1ed80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ed90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1eda0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
1edb0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1edc0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
1edd0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1ede0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1edf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
1ee00 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
1ee10 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1ee20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ee30 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1ee40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ee50 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
1ee60 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
1ee70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ee80 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1ee90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1eea0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1eeb0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
1eec0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1eed0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1eee0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1eef0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1ef00 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1ef10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ef20 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
1ef30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1ef40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1ef50 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
1ef60 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
1ef70 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
1ef80 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
1ef90 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1efa0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
1efb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1efc0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
1efd0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1efe0 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
1eff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
1f000 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
1f010 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1f020 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1f030 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
1f040 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
1f050 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1f060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
1f070 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1f080 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
1f090 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1f0a0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
1f0b0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1f0c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
1f0d0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
1f0e0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
1f0f0 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
1f100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f110 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1f120 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1f130 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
1f140 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1f150 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1f160 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1f170 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1f180 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1f190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f1a0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1f1b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
1f1c0 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
1f1d0 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
1f1e0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
1f1f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1f200 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
1f210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f220 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
1f230 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1f240 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
1f250 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1f260 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
1f270 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
1f280 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
1f290 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
1f2a0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
1f2b0 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
1f2c0 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
1f2d0 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
1f2e0 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
1f2f0 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
1f300 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
1f310 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
1f320 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
1f330 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
1f340 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
1f350 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1f360 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1f370 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
1f380 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
1f390 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
1f3a0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
1f3b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
1f3c0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
1f3d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1f3e0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
1f3f0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
1f400 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
1f410 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1f420 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
1f430 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
1f440 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
1f450 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1f460 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1f470 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1f480 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
1f490 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1f4a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1f4b0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
1f4c0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
1f4d0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
1f4e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f4f0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1f500 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1f510 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1f520 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1f530 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
1f550 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1f560 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1f570 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
1f580 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
1f590 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f5a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f5b0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1f5c0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1f5d0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1f5e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f5f0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
1f600 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
1f610 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
1f640 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
1f650 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
1f660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f670 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20  hePop(pParse);  
1f680 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
1f690 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
1f6a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f6b0 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
1f6c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1f6d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1f6e0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
1f6f0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
1f700 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
1f710 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1f720 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
1f730 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
1f740 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
1f750 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
1f760 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
1f770 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
1f780 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
1f790 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
1f7a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
1f7b0 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
1f7c0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1f7d0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
1f7e0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
1f7f0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
1f800 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
1f810 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
1f820 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
1f830 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
1f840 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
1f850 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
1f860 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
1f870 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
1f880 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
1f890 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1f8a0 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
1f8b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
1f8c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
1f8d0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
1f8e0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
1f8f0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
1f900 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
1f910 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
1f920 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
1f930 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
1f940 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
1f950 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
1f960 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
1f970 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
1f980 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
1f990 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
1f9a0 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
1f9b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
1f9c0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
1f9d0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
1f9e0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
1f9f0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
1fa00 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
1fa10 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
1fa20 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1fa30 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
1fa40 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
1fa50 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
1fa60 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
1fa70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1fa80 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1fa90 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1faa0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1fab0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
1fac0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1fad0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
1fae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1faf0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1fb00 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1fb10 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1fb20 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1fb30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1fb40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1fb50 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63   OP_Function0, c
1fb60 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
1fb70 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1fb90 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
1fba0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
1fbb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1fbc0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
1fbd0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1fbe0 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
1fbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fc00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1fc10 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1fc20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
1fc30 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1fc40 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1fc50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1fc60 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1fc70 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
1fc80 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1fc90 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
1fca0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fcb0 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
1fcc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fcd0 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
1fce0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
1fcf0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
1fd00 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
1fd10 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1fd20 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
1fd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
1fd40 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
1fd50 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
1fd60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fd70 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1fd80 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1fd90 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
1fda0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1fdb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fdc0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1fdd0 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
1fde0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
1fdf0 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
1fe00 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
1fe10 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
1fe20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1fe30 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
1fe40 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30  xpr->pLeft, 0, 0
1fe50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fe60 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
1fe70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70  Left->iTable + p
1fe80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
1fe90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fea0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
1feb0 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
1fec0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1fed0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
1fee0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
1fef0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1ff00 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
1ff10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ff20 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1ff30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1ff40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1ff50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1ff60 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
1ff70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1ff80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ff90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1ffa0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1ffb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ffc0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1ffd0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
1ffe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fff0 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
20000 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
20010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
20020 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
20030 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
20040 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
20050 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
20060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20070 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
20080 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
20090 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
200a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
200b0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
200c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
200d0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
200e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
200f0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
20100 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
20110 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
20120 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20130 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
20140 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
20150 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20160 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
20170 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
20180 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
20190 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
201a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
201b0 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
201c0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
201d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
201e0 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61   TK_SPAN:.    ca
201f0 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
20200 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
20210 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  S: {.      retur
20220 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
20230 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
20240 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
20250 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rget);.    }..  
20260 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
20270 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
20280 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
20290 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
202a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
202b0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
202c0 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
202d0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
202e0 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
202f0 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
20300 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
20310 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
20320 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
20330 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
20340 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
20350 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
20360 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
20370 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
20380 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
20390 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
203a0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
203b0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
203c0 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
203d0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
203e0 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
203f0 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
20400 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
20410 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
20420 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
20430 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
20440 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
20450 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
20460 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
20470 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
20480 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
20490 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
204a0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
204b0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
204c0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
204d0 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
204e0 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
204f0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
20500 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
20510 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
20520 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
20530 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
20540 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
20550 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
20560 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
20570 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
20580 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
20590 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
205a0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
205b0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
205c0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
205d0 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
205e0 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
205f0 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
20600 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
20610 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
20620 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
20630 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
20640 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
20650 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
20660 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20670 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
20680 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
20690 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
206a0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
206b0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
206c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
206d0 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
206e0 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
206f0 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
20700 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
20710 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
20720 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
20730 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
20740 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
20750 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
20760 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
20770 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
20780 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
20790 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
207a0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
207b0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
207c0 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
207d0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
207e0 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
207f0 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
20800 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
20810 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
20820 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
20830 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
20840 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
20850 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
20860 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
20870 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
20880 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
20890 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
208a0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
208b0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
208c0 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
208d0 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
208e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
208f0 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
20900 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20910 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20920 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
20930 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
20940 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
20950 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
20960 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
20970 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
20980 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
20990 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
209a0 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
209b0 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
209c0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
209d0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
209e0 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
209f0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
20a00 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
20a10 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
20a20 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
20a30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
20a40 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
20a50 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
20a60 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
20a70 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a   real..      **.
20a80 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
20a90 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37  E-OF: R-60985-57
20aa0 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  662 SQLite will 
20ab0 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
20ac0 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20  e back to.      
20ad0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
20ae0 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  t when extractin
20af0 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65  g it from the re
20b00 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cord.  */.      
20b10 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
20b20 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
20b30 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
20b40 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
20b50 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
20b60 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
20b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20b80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
20b90 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
20ba0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
20bb0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
20bc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
20bd0 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20  e TK_VECTOR: {. 
20be0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20bf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
20c00 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
20c10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20c20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
20c30 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
20c40 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
20c50 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
20c60 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
20c70 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
20c80 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
20c90 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
20ca0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
20cb0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
20cc0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
20cd0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
20ce0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
20cf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
20d00 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
20d10 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
20d20 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
20d30 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
20d40 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
20d50 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
20d60 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
20d70 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
20d80 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
20d90 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
20da0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
20db0 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
20dc0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
20dd0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
20de0 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
20df0 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
20e00 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
20e10 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
20e20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
20e30 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
20e40 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
20e50 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
20e60 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
20e70 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
20e80 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
20e90 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
20ea0 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
20eb0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
20ec0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
20ed0 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
20ee0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
20ef0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
20f00 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
20f10 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
20f20 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
20f30 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
20f40 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
20f50 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
20f60 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
20f70 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
20f80 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
20f90 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
20fa0 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
20fb0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
20fc0 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
20fd0 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
20fe0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
21010 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
21020 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
21030 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21050 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
21060 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
21070 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
21080 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210a0 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
210b0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
210c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
210f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
21100 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21120 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
21130 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
21140 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
21150 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
21160 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
21170 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
21180 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
211b0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
211c0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
211f0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
21200 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
21210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21220 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
21230 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
21240 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
21250 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
21260 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
21270 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
21280 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
21290 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
212a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
212b0 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
212c0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
212d0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
212e0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
212f0 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
21300 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
21310 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
21320 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
21330 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
21340 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
21350 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
21360 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21370 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21380 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
21390 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
213a0 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
213b0 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
213c0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
213d0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
213e0 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
213f0 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f  r(&tempX, exprCo
21400 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
21410 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
21420 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
21430 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
21440 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
21450 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65  emset(&opCompare
21460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f  , 0, sizeof(opCo
21470 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20  mpare));.       
21480 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
21490 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
214a0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
214b0 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20   &tempX;.       
214c0 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
214d0 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
214e0 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
214f0 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
21500 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
21510 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
21520 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
21530 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
21540 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
21550 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
21560 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
21570 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
21580 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
21590 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
215a0 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
215b0 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
215c0 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
215d0 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
215e0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
215f0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
21600 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
21610 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
21620 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21630 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
21640 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
21650 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21660 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
21670 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
21680 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
21690 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
216a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
216b0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
216c0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
216d0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
216e0 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
216f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21700 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21710 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
21720 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
21730 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
21740 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
21750 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
21760 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
21770 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
21780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
21790 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
217a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
217b0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
217c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
217d0 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
217e0 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
217f0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
21800 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
21810 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
21820 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
21830 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
21840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21850 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
21860 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
21870 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
21880 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
21890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
218a0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
218b0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
218c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
218d0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
218e0 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
218f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
21900 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21910 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
21920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21940 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
21950 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
21960 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
21970 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
21980 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
21990 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
219a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
219b0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
219c0 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
219d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
219e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
219f0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
21a00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
21a10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21a20 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
21a30 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
21a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
21a50 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21a60 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
21a70 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
21a80 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
21a90 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
21aa0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
21ab0 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
21ac0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
21ad0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
21ae0 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
21af0 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
21b00 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
21b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21b20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
21b50 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
21b60 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
21b70 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
21b80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21b90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      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 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
21bc0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
21bd0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
21be0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
21bf0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
21c00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
21c10 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
21c20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
21c30 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
21c40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21c50 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
21c60 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
21c70 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
21c80 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
21c90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
21ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
21cb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
21cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21cd0 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
21ce0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
21cf0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
21d00 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21d30 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
21d40 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
21d50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
21d70 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
21d80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
21d90 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
21da0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
21db0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
21dc0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
21dd0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
21de0 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
21df0 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
21e00 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
21e10 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
21e20 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
21e30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
21e40 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72  odeAtInit(.  Par
21e50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
21e60 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
21e70 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
21e80 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
21e90 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  expression to co
21ea0 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  de when the VDBE
21eb0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a   initializes */.
21ec0 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20    int regDest,  
21ed0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
21ee0 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
21ef0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20  egister */.  u8 
21f00 72 65 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f  reusable       /
21f10 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 65  * True if this e
21f20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75  xpression is reu
21f30 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  sable */.){.  Ex
21f40 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
21f50 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
21f60 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
21f70 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
21f80 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20  stExpr;.  pExpr 
21f90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
21fa0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
21fb0 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
21fc0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
21fd0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
21fe0 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
21ff0 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
22000 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
22010 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
22020 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
22030 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
22040 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20  Reg = regDest;. 
22050 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61      pItem->reusa
22060 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a  ble = reusable;.
22070 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
22080 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a  onstExpr = p;.}.
22090 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
220a0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
220b0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
220c0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
220d0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
220e0 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
220f0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
22100 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
22110 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
22120 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
22130 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
22140 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
22150 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
22160 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
22170 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
22180 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
22190 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
221a0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
221b0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
221c0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
221d0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
221e0 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
221f0 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
22200 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
22210 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
22220 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
22230 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
22240 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
22250 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
22260 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
22270 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
22280 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
22290 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
222a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
222b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
222c0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
222d0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
222e0 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
222f0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
22300 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
22310 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
22320 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
22330 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
22340 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
22350 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
22360 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
22370 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
22380 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20      ExprList *p 
22390 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
223a0 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Expr;.    int i;
223b0 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b  .    *pReg  = 0;
223c0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
223d0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
223e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
223f0 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d  .      for(pItem
22400 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70  =p->a, i=p->nExp
22410 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c  r; i>0; pItem++,
22420 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69   i--){.        i
22430 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
22440 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
22450 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
22460 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d  pExpr,pExpr,-1)=
22470 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22480 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
22490 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
224a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
224b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20  .    }.    r2 = 
224c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
224d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
224e0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
224f0 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b  , pExpr, r2, 1);
22500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
22510 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
22520 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
22530 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
22540 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
22550 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22560 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
22570 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
22580 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
22590 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
225a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
225b0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
225c0 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
225d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
225e0 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
225f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
22600 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
22610 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
22620 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
22630 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
22640 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
22650 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
22660 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
22670 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
22680 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
22690 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
226a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
226b0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
226c0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
226d0 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
226e0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
226f0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
22700 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
22710 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
22720 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
22730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22740 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
22750 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
22760 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
22770 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
22780 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
22790 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
227a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
227b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
227c0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
227d0 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
227e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
227f0 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
22800 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
22810 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
22820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22830 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
22840 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
22850 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
22860 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
22870 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
22880 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
22890 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
228a0 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
228b0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
228c0 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
228d0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
228e0 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
228f0 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
22900 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
22910 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
22920 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
22930 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
22940 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
22950 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
22960 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
22970 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
22980 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22990 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
229a0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
229b0 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
229c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
229d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
229e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
229f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22a00 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
22a10 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
22a20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
22a30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
22a40 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
22a50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
22a60 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
22a70 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
22a80 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
22a90 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
22aa0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
22ab0 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
22ac0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
22ad0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22ae0 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
22af0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
22b00 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
22b10 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
22b20 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
22b30 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
22b40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22b50 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
22b60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
22b70 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
22b80 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
22b90 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
22ba0 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
22bb0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
22bc0 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
22bd0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
22be0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
22bf0 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d   target, 0);.  }
22c00 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
22c10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
22c20 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
22c30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
22c40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
22c50 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
22c60 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
22c70 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
22c80 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
22c90 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
22ca0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
22cb0 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
22cc0 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
22cd0 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
22ce0 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
22cf0 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
22d00 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
22d10 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
22d20 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
22d30 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
22d40 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
22d50 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
22d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22d70 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
22d80 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
22d90 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
22da0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
22db0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
22dc0 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
22dd0 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
22de0 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
22df0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
22e00 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
22e10 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
22e20 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
22e30 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
22e40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
22e50 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
22e60 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
22e70 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
22e80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
22e90 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
22ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22eb0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
22ec0 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
22ed0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22ee0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
22ef0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
22f00 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
22f10 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
22f20 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
22f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22f40 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
22f50 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
22f60 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
22f70 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
22f80 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
22f90 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
22fa0 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
22fb0 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
22fc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
22fd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
22fe0 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
22ff0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
23000 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
23010 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
23020 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
23030 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
23040 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
23050 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
23060 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
23070 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
23080 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
23090 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
230a0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
230b0 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
230c0 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
230d0 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
230e0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
230f0 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
23100 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
23110 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
23120 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
23130 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
23140 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
23150 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
23160 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
23170 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
23180 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
23190 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
231a0 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
231b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
231c0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
231d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
231e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
231f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
23200 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
23210 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
23220 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
23230 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
23240 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
23250 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
23260 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72  ults */.  int sr
23270 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  cReg,        /* 
23280 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73  Source registers
23290 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   if SQLITE_ECEL_
232a0 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  REF */.  u8 flag
232b0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
232c0 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
232d0 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
232e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
232f0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
23300 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   j, n;.  u8 copy
23310 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
23320 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
23330 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
23340 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  opy;.  Vdbe *v =
23350 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
23360 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
23370 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23380 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
23390 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
233a0 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
233b0 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
233c0 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
233d0 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
233e0 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
233f0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
23400 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
23410 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
23420 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
23430 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
23440 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
23450 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
23460 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
23470 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
23480 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
23490 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 4c 69 73  !=0 && (j = pLis
234a0 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  t->a[i].u.x.iOrd
234b0 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
234c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
234d0 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
234e0 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72   j+srcReg-1, tar
234f0 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
23500 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53  e if( (flags & S
23510 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
23520 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
23530 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
23540 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
23550 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
23560 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
23570 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
23580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23590 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
235a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
235b0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
235c0 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
235d0 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
235e0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
235f0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
23600 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70  .        if( cop
23610 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  yOp==OP_Copy.   
23620 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71        && (pOp=sq
23630 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
23640 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  , -1))->opcode==
23650 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
23660 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
23670 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20  >p3+1==inReg.   
23680 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
23690 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67  +pOp->p3+1==targ
236a0 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  et+i.        ){.
236b0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
236c0 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  3++;.        }el
236d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
236e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
236f0 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67  v, copyOp, inReg
23700 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
23710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23720 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23730 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
23740 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
23750 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
23760 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
23770 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
23780 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
23790 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
237a0 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
237b0 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
237c0 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
237d0 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
237e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
237f0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69  xpression.** eli
23800 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  mination of x..*
23810 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66  *.** The xJumpIf
23820 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
23830 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a  mines details:.*
23840 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20  *.**    NULL:   
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23860 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61  Store the boolea
23870 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b  n result in reg[
23880 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69  dest].**    sqli
23890 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20  te3ExprIfTrue:  
238a0 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
238b0 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73   if true.**    s
238c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
238d0 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64  e:     Jump to d
238e0 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a  est if false.**.
238f0 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c  ** The jumpIfNul
23900 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  l parameter is i
23910 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49  gnored if xJumpI
23920 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  f is NULL..*/.st
23930 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
23940 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
23950 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
23960 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
23970 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
23980 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
23990 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
239a0 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
239b0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
239c0 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
239d0 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
239e0 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63  n or storage loc
239f0 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
23a00 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c  (*xJump)(Parse*,
23a10 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20  Expr*,int,int), 
23a20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b  /* Action to tak
23a30 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
23a40 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
23a50 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
23a60 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
23a70 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70   */.){. Expr exp
23a80 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
23a90 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
23aa0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
23ab0 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
23ac0 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
23ad0 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
23ae0 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
23af0 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
23b00 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
23b10 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
23b20 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
23b30 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
23b40 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
23b50 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
23b60 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d  ister */...  mem
23b70 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30  set(&compLeft, 0
23b80 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
23b90 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52  .  memset(&compR
23ba0 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ight, 0, sizeof(
23bb0 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
23bc0 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69  (&exprAnd, 0, si
23bd0 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
23be0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23bf0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23c00 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
23c10 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
23c20 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
23c30 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
23c40 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
23c50 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
23c60 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
23c70 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
23c80 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
23c90 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
23ca0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
23cb0 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
23cc0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
23cd0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
23ce0 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
23cf0 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
23d00 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
23d10 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
23d20 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
23d30 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
23d40 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
23d50 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70  ster(&exprX, exp
23d60 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
23d70 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
23d80 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78  Free1));.  if( x
23d90 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d  Jump ){.    xJum
23da0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  p(pParse, &exprA
23db0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
23dc0 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
23dd0 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20      exprX.flags 
23de0 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
23df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23e00 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
23e10 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
23e20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
23e30 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
23e40 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
23e50 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
23e60 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
23e70 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
23e80 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
23e90 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
23ea0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
23eb0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
23ec0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
23ed0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
23ee0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
23ef0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
23f00 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
23f10 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
23f20 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
23f30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
23f40 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
23f50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23f60 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
23f70 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
23f80 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
23f90 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
23fa0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
23fb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23fc0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
23fd0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
23fe0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
23ff0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24000 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
24010 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
24020 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24030 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24040 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
24050 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
24060 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
24070 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
24080 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24090 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
240a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
240b0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
240c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
240d0 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mp==0 );.}../*.*
240e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
240f0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
24100 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
24110 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
24120 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
24130 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
24140 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
24150 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
24160 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
24170 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
24180 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
24190 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
241a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
241b0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
241c0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
241d0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
241e0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
241f0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
24200 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
24210 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
24220 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
24230 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
24240 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
24250 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
24260 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
24270 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
24280 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
24290 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
242a0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
242b0 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
242c0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
242d0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
242e0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
242f0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
24300 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
24310 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
24320 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
24330 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
24340 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
24350 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
24360 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
24370 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
24380 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24390 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
243a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
243b0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
243c0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
243d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
243e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
243f0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
24400 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
24410 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
24420 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
24430 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
24440 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
24450 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
24460 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
24470 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
24480 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
24490 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
244a0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
244b0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
244c0 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
244d0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
244e0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
244f0 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
24500 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
24510 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
24520 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
24530 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
24540 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
24550 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
24560 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
24570 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
24580 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24590 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
245a0 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
245b0 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
245c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
245d0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
245e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
245f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24600 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24610 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
24620 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24630 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24640 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
24650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24660 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
24670 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
24680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24690 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
246a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
246b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
246c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
246d0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
246e0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
246f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24700 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24710 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
24720 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24730 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
24740 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
24750 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
24760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24770 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
24780 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
24790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
247a0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
247b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
247c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
247d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
247e0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
247f0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
24800 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24820 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
24830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
24840 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  OT:.      testca
24850 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
24860 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24870 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
24880 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
24890 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
248a0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a  : TK_NE;.      j
248b0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
248c0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
248d0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
248e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
248f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
24900 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
24910 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
24920 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
24930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
24940 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
24950 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
24960 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
24970 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
24980 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
24990 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
249a0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
249b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
249c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
249d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
249e0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
249f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24a00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
24a10 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
24a20 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
24a30 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
24a40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
24a50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
24a60 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
24a70 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
24a80 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
24a90 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
24aa0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
24ab0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
24ac0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24ad0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
24ae0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
24af0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
24b00 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
24b10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24b20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
24b30 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
24b40 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
24b50 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
24b60 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
24b70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
24b80 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
24b90 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
24ba0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
24bb0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24bc0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
24bd0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
24be0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
24bf0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
24c00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24c10 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
24c20 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
24c30 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
24c40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24c50 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
24c60 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
24c70 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
24c80 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
24c90 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
24ca0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
24cb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
24cc0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
24cd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
24ce0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
24cf0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24d00 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
24d10 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
24d20 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
24d30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
24d40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
24d50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
24d60 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
24d70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24d80 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
24d90 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
24da0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
24db0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
24dc0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
24dd0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
24de0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
24df0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
24e00 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
24e10 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
24e20 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
24e30 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
24e40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24e50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
24e60 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
24e70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24e80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
24e90 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
24ea0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
24eb0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
24ec0 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
24ed0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
24ee0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
24ef0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
24f00 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
24f10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24f20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
24f30 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
24f40 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
24f50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
24f60 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
24f70 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
24f80 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  , sqlite3ExprIfT
24f90 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  rue, jumpIfNull)
24fa0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24fb0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
24fc0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
24fd0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
24fe0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
24ff0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
25000 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25010 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
25020 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
25030 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
25040 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
25050 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
25060 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
25070 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
25080 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
25090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
250a0 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
250b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
250c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
250d0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
250e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
250f0 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
25100 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c  lt: {.    defaul
25110 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66  t_expr:.      if
25120 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
25130 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
25140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
25150 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
25160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
25170 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
25180 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
25190 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * No-op */.     
251a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
251b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
251c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
251d0 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
251e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
251f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
25200 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
25210 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
25220 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
25230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
25240 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
25250 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
25260 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
25270 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
25280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
25290 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
252a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
252b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
252c0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
252d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
252e0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
252f0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
25300 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
25310 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
25320 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
25330 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
25340 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
25350 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
25360 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
25370 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
25380 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
25390 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
253a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
253b0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
253c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
253d0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
253e0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
253f0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
25400 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
25410 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
25420 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
25430 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
25440 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
25450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25460 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
25470 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
25480 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
25490 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
254a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
254b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
254c0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
254d0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
254e0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
254f0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
25500 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
25510 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
25520 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
25530 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
25540 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
25550 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
25560 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
25570 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
25580 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
25590 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
255a0 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
255b0 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
255c0 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
255d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
255e0 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
255f0 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
25600 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
25610 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
25620 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
25630 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
25640 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
25650 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
25660 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
25670 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
25680 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
25690 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
256a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
256b0 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
256c0 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
256d0 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
256e0 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
256f0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
25700 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
25710 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
25720 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
25730 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
25740 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
25750 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
25760 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
25770 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
25780 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
25790 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
257a0 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
257b0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
257c0 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
257d0 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
257e0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
257f0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
25800 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
25810 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
25820 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
25830 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
25840 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
25850 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
25860 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
25870 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
25880 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
25890 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
258a0 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
258b0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
258c0 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
258d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
258e0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
258f0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
25900 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25910 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
25920 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
25930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25940 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
25950 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
25960 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25970 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
25980 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
25990 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
259a0 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
259b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
259c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
259d0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
259e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
259f0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
25a00 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
25a10 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25a20 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
25a30 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
25a40 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
25a50 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
25a60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25a70 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25a90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25aa0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25ab0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25ac0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
25ad0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
25ae0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
25af0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25b00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25b10 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
25b20 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
25b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25b40 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
25b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
25b70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
25b80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25b90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
25ba0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
25bb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
25bc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25bd0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
25be0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
25bf0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
25c00 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
25c10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25c20 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
25c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25c40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
25c50 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25c60 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25c70 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
25c80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
25c90 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
25ca0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25cb0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
25cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25cd0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
25ce0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
25cf0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25d00 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
25d10 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
25d20 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25d30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25d40 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
25d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
25d60 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
25d70 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
25d80 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
25d90 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
25da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25db0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
25dc0 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
25dd0 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
25de0 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
25df0 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _EQ;.      jumpI
25e00 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
25e10 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
25e20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
25e30 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
25e40 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
25e50 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
25e60 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
25e70 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
25e80 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
25e90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25ea0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
25eb0 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
25ec0 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
25ed0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25ee0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25ef0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
25f00 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
25f10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25f20 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
25f30 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
25f40 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
25f50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25f60 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
25f70 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
25f80 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
25f90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
25fa0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fc0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
25fd0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
25fe0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
25ff0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
26000 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
26010 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26020 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
26030 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
26040 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
26050 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
26060 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26070 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
26080 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
26090 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
260a0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
260b0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
260c0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
260d0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
260e0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
260f0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
26100 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
26110 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
26120 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
26130 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26140 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
26150 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26160 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
26170 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26180 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
26190 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
261a0 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
261b0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
261c0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
261d0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
261e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
261f0 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
26200 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26210 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
26220 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
26230 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
26240 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26250 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
26260 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
26270 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
26280 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
26290 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
262a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
262b0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
262c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
262d0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
262e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
262f0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
26300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26310 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
26320 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
26330 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
26340 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26350 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
26360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26370 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
26380 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
26390 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
263a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
263b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
263c0 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
263d0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
263e0 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
263f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
26400 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
26410 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26420 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
26430 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
26440 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26450 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
26460 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
26470 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
26480 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26490 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  lse, jumpIfNull)
264a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
264b0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
264c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
264d0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
264e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
264f0 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
26500 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26510 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
26520 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
26530 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26540 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
26550 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
26560 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
26570 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26580 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
26590 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
265a0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
265b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
265c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
265d0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
265e0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
265f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
26600 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
26610 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20    default_expr: 
26620 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
26630 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
26640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
26650 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
26660 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
26670 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
26680 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
26690 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
266a0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
266b0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
266c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
266d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
266e0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
266f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26700 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
26710 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
26720 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
26730 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26740 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
26750 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
26760 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
26770 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
26780 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
26790 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
267a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
267b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
267c0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
267d0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
267e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
267f0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
26800 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
26810 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26820 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
26830 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
26840 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
26850 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
26860 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
26870 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
26880 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
26890 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
268a0 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
268b0 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
268c0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
268d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
268e0 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
268f0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
26900 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
26910 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
26920 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26930 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
26940 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
26950 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
26960 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
26970 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
26980 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
26990 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
269a0 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
269b0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
269c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
269d0 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
269e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  }.../*.** Do a d
269f0 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
26a00 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
26a10 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
26a20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  0 if the two.** 
26a30 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
26a40 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74  completely ident
26a50 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20  ical.  Return 1 
26a60 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f  if they differ o
26a70 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c  nly.** by a COLL
26a80 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20  ATE operator at 
26a90 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20  the top level.  
26aa0 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72  Return 2 if ther
26ab0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
26ac0 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20  s.** other than 
26ad0 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f  the top-level CO
26ae0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
26af0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
26b00 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
26b10 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
26b20 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
26b30 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
26b40 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
26b50 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
26b60 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
26b70 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
26b80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73  ..**.** The pA s
26b90 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69  ide might be usi
26ba0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20  ng TK_REGISTER. 
26bb0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
26bc0 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a  case and pB is.*
26bd0 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52  * not using TK_R
26be0 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f  EGISTER but is o
26bf0 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c  therwise equival
26c00 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  ent, then still 
26c10 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
26c20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
26c30 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
26c40 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65  rn 2 even if the
26c50 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
26c60 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
26c70 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
26c80 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
26c90 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
26ca0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
26cb0 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
26cc0 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  2 just to be saf
26cd0 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
26ce0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
26cf0 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  s 2, then you do
26d00 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
26d10 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
26d20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
26d30 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
26d40 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
26d50 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65   get a 0 or 1 re
26d60 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
26d70 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
26d80 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
26d90 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
26da0 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
26db0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
26dc0 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
26dd0 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
26de0 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74  t an extra 2 - t
26df0 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
26e00 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
26e10 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
26e20 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
26e30 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
26e40 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75  rrect 0 or 1 cou
26e50 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
26e60 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
26e70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
26e80 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
26e90 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
26ea0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
26eb0 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
26ec0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
26ed0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
26ee0 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
26ef0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
26f00 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
26f10 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
26f20 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
26f30 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
26f40 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
26f50 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
26f60 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
26f70 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
26f80 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
26f90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
26fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
26fb0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
26fc0 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
26fd0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
26fe0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
26ff0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
27000 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29  pLeft, pB, iTab)
27010 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
27020 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
27030 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pB->op==TK_C
27040 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
27050 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c  3ExprCompare(pA,
27060 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
27070 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
27080 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
27090 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
270a0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
270b0 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
270c0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
270d0 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
270e0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
270f0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
27100 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27110 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
27120 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
27130 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
27140 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
27150 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e  f( strcmp(pA->u.
27160 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
27170 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
27180 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d   return pA->op==
27190 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a  TK_COLLATE ? 1 :
271a0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
271b0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
271c0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
271d0 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
271e0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
271f0 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  n 2;.  if( ALWAY
27200 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
27210 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
27220 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ==0) ){.    if( 
27230 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
27240 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
27250 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
27260 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
27270 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
27280 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  B->pLeft, iTab) 
27290 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
272a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
272b0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
272c0 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
272d0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
272e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
272f0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
27300 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
27310 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
27320 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
27330 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
27340 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
27350 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70  educed)==0) && p
27360 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
27370 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
27380 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
27390 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
273a0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
273b0 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
273c0 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
273d0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
273e0 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
273f0 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
27400 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
27410 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
27420 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
27430 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
27440 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
27450 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
27460 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
27470 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
27480 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
27490 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
274a0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
274b0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
274c0 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
274d0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
274e0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
274f0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
27500 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
27510 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
27520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27530 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
27540 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
27550 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
27560 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
27570 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
27580 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
27590 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
275a0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
275b0 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
275c0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
275d0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
275e0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
275f0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
27600 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
27610 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
27620 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
27630 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
27640 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
27650 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
27660 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
27670 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
27680 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
27690 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
276a0 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
276b0 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
276c0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
276d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
276e0 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
276f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
27700 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
27710 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
27720 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
27730 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
27740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
27750 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27760 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
27770 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
27780 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
27790 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
277a0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
277b0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
277c0 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
277d0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
277e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
277f0 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
27800 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29   pExprB, iTab) )
27810 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
27820 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27830 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
27840 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
27850 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
27860 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
27870 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
27880 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
27890 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
278a0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
278b0 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
278c0 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
278d0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
278e0 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
278f0 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
27900 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
27910 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
27920 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
27930 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
27940 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
27950 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
27960 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
27970 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
27980 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
27990 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
279a0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
279b0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
279c0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
279d0 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
279e0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
279f0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
27a00 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
27a10 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
27a20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
27a30 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
27a40 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
27a50 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
27a60 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
27a70 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
27a80 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
27a90 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
27aa0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
27ab0 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
27ac0 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
27ad0 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
27ae0 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
27af0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
27b00 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
27b10 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
27b20 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
27b30 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
27b40 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
27b50 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
27b60 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
27b70 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
27b80 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
27b90 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
27ba0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
27bb0 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
27bc0 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
27bd0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
27be0 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
27bf0 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
27c00 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
27c10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27c20 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
27c30 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
27c40 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
27c50 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
27c60 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
27c70 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
27c80 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
27c90 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
27ca0 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
27cb0 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
27cc0 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
27cd0 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
27ce0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
27cf0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
27d00 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c  OTNULL.   && sql
27d10 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
27d20 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d  pE1->pLeft, pE2-
27d30 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
27d40 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21  .   && (pE1->op!
27d50 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
27d60 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20  1->op!=TK_IS).  
27d70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
27d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
27da0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
27db0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
27dc0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
27dd0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
27de0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
27df0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  n expression can
27e00 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79   be evaluated by
27e10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
27e20 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c  e.** index only,
27e30 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
27e40 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  to do a search f
27e50 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
27e60 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e  ding.** table en
27e70 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76  try.  The IdxCov
27e80 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73  er.pIdx field is
27e90 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78   the index.  Idx
27ea0 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73  Cover.iCur.** is
27eb0 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
27ec0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
27ed0 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a  ruct IdxCover {.
27ee0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
27ef0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
27f00 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  to be tested for
27f10 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69   coverage */.  i
27f20 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
27f30 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
27f40 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63   for the table c
27f50 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
27f60 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a  the index */.};.
27f70 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
27f80 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
27f90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
27fa0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
27fb0 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
27fc0 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63  IdxCover->iCur c
27fd0 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20  an be satisfied 
27fe0 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a  using the index.
27ff0 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
28000 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a  dxCover->pIdx..*
28010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
28020 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72  rIdxCover(Walker
28030 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
28040 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
28050 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
28060 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
28070 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
28080 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
28090 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Cur.   && sqlite
280a0 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
280b0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
280c0 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72  ver->pIdx, pExpr
280d0 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29  ->iColumn)<0.  )
280e0 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
280f0 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  Code = 1;.    re
28100 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
28120 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28130 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
28140 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f   an index pIdx o
28150 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  n table with cur
28160 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e  sor iCur contain
28170 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78  s will.** the ex
28180 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
28190 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
281a0 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63  the index does c
281b0 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72  over the.** expr
281c0 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65  ession and false
281d0 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78   if the pExpr ex
281e0 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e  pression referen
281f0 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ces table column
28200 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f  s.** that are no
28210 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69  t found in the i
28220 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
28230 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69   An index coveri
28240 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
28250 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
28260 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
28270 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75  e.** evaluated u
28280 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e  sing only the in
28290 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20  dex and without 
282a0 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70  having to lookup
282b0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
282c0 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72  nding table entr
282d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
282e0 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e  3ExprCoveredByIn
282f0 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78  dex(.  Expr *pEx
28300 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pr,        /* Th
28310 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
28320 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sted */.  int iC
28330 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur,           /*
28340 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   The cursor numb
28350 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  er for the corre
28360 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a  sponding table *
28370 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
28380 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
28390 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20  ndex that might 
283a0 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  be used for cove
283b0 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c  rage */.){.  Wal
283c0 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
283d0 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20  IdxCover xcov;. 
283e0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
283f0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f  izeof(w));.  xco
28400 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  v.iCur = iCur;. 
28410 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64   xcov.pIdx = pId
28420 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  x;.  w.xExprCall
28430 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f  back = exprIdxCo
28440 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43  ver;.  w.u.pIdxC
28450 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20  over = &xcov;.  
28460 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
28470 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65  &w, pExpr);.  re
28480 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d  turn !w.eCode;.}
28490 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  .../*.** An inst
284a0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
284b0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
284c0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
284d0 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
284e0 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
284f0 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
28500 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
28510 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
28520 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
28530 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
28540 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
28550 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
28560 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
28570 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
28580 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
28590 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
285a0 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
285b0 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
285c0 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
285d0 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
285e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
285f0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
28600 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
28610 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
28620 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28630 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
28640 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
28650 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
28660 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
28670 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
28680 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
28690 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
286a0 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
286b0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
286c0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
286d0 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
286e0 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
286f0 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
28700 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
28710 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
28720 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
28730 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
28740 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
28750 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
28760 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
28770 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
28780 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
28790 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
287a0 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
287b0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
287c0 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
287d0 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
287e0 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
287f0 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
28800 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
28810 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
28820 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
28830 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
28840 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
28850 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
28860 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
28870 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
28880 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
28890 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
288a0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
288b0 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
288c0 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63  Src ? pSrc->nSrc
288d0 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
288e0 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
288f0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
28900 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
28910 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
28920 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28930 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20  if( i<nSrc ){.  
28940 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
28950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28960 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
28970 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28980 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28990 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
289a0 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
289b0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
289c0 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
289d0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
289e0 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
289f0 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
28a00 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
28a10 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
28a20 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
28a30 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
28a40 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
28a50 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
28a60 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
28a70 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
28a80 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
28a90 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
28aa0 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
28ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
28ac0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
28ad0 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
28ae0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
28af0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
28b00 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
28b10 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
28b20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
28b30 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
28b40 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
28b50 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
28b60 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
28b70 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
28b80 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
28b90 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
28ba0 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
28bb0 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
28bc0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
28bd0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
28be0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
28bf0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
28c00 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
28c10 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
28c20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
28c30 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
28c40 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
28c50 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
28c60 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
28c70 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
28c80 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
28c90 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
28ca0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
28cb0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
28cc0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
28cd0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
28ce0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
28cf0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
28d00 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
28d10 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
28d20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
28d30 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
28d40 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
28d50 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
28d60 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
28d70 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
28d80 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
28d90 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
28da0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
28db0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
28dc0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
28dd0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
28de0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
28df0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
28e00 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
28e10 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
28e20 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
28e30 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
28e40 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
28e50 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
28e60 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
28e70 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
28e80 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
28e90 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
28ea0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
28eb0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
28ec0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
28ed0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
28ee0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
28ef0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
28f00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
28f10 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
28f20 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
28f30 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
28f40 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
28f50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
28f60 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
28f70 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
28f80 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
28f90 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
28fa0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
28fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28fc0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
28fd0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
28fe0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
28ff0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
29000 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
29010 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
29020 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
29030 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
29040 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
29050 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
29060 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
29070 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
29080 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
29090 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
290a0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
290b0 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
290c0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
290d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
290e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
290f0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
29100 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
29110 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
29120 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
29130 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
29140 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
29150 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
29160 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
29170 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
29180 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
29190 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
291a0 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
291b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
291c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
291d0 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
291e0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
291f0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
29200 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
29210 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
29220 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29230 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
29240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
29250 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
29260 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
29270 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
29280 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29290 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
292a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
292b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
292c0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
292d0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
292e0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
292f0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
29300 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
29310 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
29320 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
29330 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
29340 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
29350 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29360 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
29370 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
29380 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
29390 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
293a0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
293b0 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
293c0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
293d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
293e0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
293f0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
29400 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
29410 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
29420 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
29430 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
29440 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
29450 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
29460 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
29470 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
29480 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
29490 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
294a0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
294b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
294d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
294e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
294f0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
29500 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
29510 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
29520 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
29530 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
29540 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
29550 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
29560 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
29570 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
29580 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29590 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
295a0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
295b0 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
295c0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
295d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
295e0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
295f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29610 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
29620 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29630 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
29640 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
29650 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
29660 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
29670 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
29680 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
29690 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
296b0 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
296c0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
296d0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
296e0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
296f0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
29700 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
29710 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
29720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29730 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
29740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29750 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
29760 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29780 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
29790 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
297a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
297b0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
297c0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
297d0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
297e0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
297f0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
29800 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
29810 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
29820 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
29830 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
29840 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
29850 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29880 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
298a0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
298b0 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
298e0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
298f0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
29900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29910 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
29920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29930 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
29940 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
29950 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
29960 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
29970 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
29980 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
29990 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
299a0 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
299b0 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
299c0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
299d0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
299e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
299f0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
29a00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
29a10 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
29a20 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
29a30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
29a40 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
29a50 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
29a60 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
29a70 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
29a80 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
29a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
29aa0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
29ab0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
29ac0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
29ad0 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
29ae0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29af0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
29b00 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
29b10 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
29b20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
29b30 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
29b40 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
29b50 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
29b60 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
29b70 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
29b80 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
29b90 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
29ba0 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
29bb0 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
29bc0 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
29bd0 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
29be0 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
29bf0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
29c00 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
29c10 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
29c20 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
29c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
29c40 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
29c50 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
29c60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
29c70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29c80 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29c90 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
29ca0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
29cb0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
29cc0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
29cd0 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
29ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29cf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29d00 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
29d10 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
29d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
29d30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
29d40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29d50 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
29d60 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
29d70 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
29d80 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
29d90 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
29da0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
29db0 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
29dc0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
29dd0 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
29de0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
29df0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
29e00 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
29e10 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
29e20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
29e30 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
29e40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29e50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
29e60 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
29e70 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
29e80 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
29e90 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
29ea0 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
29eb0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
29ec0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
29ed0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
29ef0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29f00 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
29f10 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
29f20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
29f30 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
29f40 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
29f50 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
29f60 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
29f70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
29fa0 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
29fb0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
29fc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
29fd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
29fe0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
29ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a000 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2a010 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2a020 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2a030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a040 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2a050 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2a060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a080 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2a090 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2a0a0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2a0b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a0c0 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2a0d0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2a0e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a0f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2a100 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2a110 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2a120 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2a130 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2a140 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2a150 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2a160 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2a170 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2a180 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2a190 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2a1a0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2a1b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2a1c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2a1d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a1e0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2a1f0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2a200 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2a210 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2a220 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2a230 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2a240 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a250 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
2a260 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a270 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
2a280 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2a290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
2a2a0 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
2a2b0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
2a2c0 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
2a2d0 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
2a2e0 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
2a2f0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
2a300 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
2a310 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
2a320 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
2a330 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
2a340 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
2a350 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
2a360 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
2a370 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
2a380 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2a390 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2a3a0 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
2a3b0 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
2a3c0 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
2a3d0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
2a3e0 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
2a3f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2a400 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
2a410 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2a420 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2a430 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
2a440 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2a450 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
2a460 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2a470 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2a480 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2a490 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2a4a0 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2a4b0 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2a4c0 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2a4d0 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2a4e0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2a4f0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2a500 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2a510 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a520 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2a530 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2a540 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2a550 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2a560 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2a570 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2a580 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2a590 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2a5a0 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2a5b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2a5c0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2a5d0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2a5e0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2a5f0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2a600 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2a610 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2a620 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2a630 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2a640 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2a650 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2a660 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2a670 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2a680 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2a690 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2a6a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2a6b0 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2a6c0 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2a6d0 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2a6e0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2a6f0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2a700 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2a710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2a720 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2a730 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2a740 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2a750 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2a760 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2a770 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2a780 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2a790 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2a7a0 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2a7b0 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2a7c0 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2a7d0 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2a7e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
2a7f0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
2a800 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
2a810 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2a820 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
2a830 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  eallocation is d
2a840 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
2a850 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
2a860 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
2a870 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
2a880 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
2a890 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2a8a0 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
2a8b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2a8c0 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
2a8d0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
2a8e0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
2a8f0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
2a900 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2a910 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
2a920 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
2a930 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
2a940 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
2a950 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
2a960 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
2a970 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
2a980 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
2a990 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
2a9a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2a9b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
2a9c0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
2a9d0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
2a9e0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
2a9f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2aa00 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
2aa10 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
2aa20 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
2aa30 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
2aa40 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2aa50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2aa60 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
2aa70 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65   i, n;.  if( nRe
2aa80 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71  g==1 ) return sq
2aa90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2aaa0 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70  pParse);.  i = p
2aab0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2aac0 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
2aad0 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
2aae0 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
2aaf0 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
2ab00 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
2ab10 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
2ab20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2ab30 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
2ab40 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2ab50 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
2ab60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
2ab70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2ab80 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2ab90 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
2aba0 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
2abb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2abc0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2abd0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
2abe0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
2abf0 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
2ac00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ac10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2ac20 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Reg);.    return
2ac30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2ac40 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
2ac50 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
2ac60 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
2ac70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2ac80 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2ac90 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
2aca0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2acb0 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
2acc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2acd0 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
2ace0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
2acf0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
2ad00 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
2ad10 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
2ad20 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
2ad30 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
2ad40 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
2ad50 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
2ad60 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
2ad70 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
2ad80 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
2ad90 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
2ada0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2adb0 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
2adc0 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
2add0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2ade0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
2adf0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
2ae00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
2ae10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2ae20 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2ae30 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
2ae40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2ae50 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
2ae60 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
2ae70 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
2ae80 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
2ae90 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2aea0 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
2aeb0 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20  Reg<iLast.   && 
2aec0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2aed0 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20  g>=iFirst.  ){. 
2aee0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2aef0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2af00 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
2af10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2af20 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2af30 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
2af40 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2af50 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
2af60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2af70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2af80 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2af90 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.