/ Hex Artifact Content
Login

Artifact f06f41e5e5daca10fb090e70a2502dcc0dbc992b:


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 2e 20  ning TK_SELECT. 
3610: 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e 0a 20 20   Not deleted..  
3620: 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20 20    ** pRight:    
3630: 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e 20        not used. 
3640: 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c 79   But recursively
3650: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3660: 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20   iColumn:       
3670: 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c    Index of a col
3680: 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a 20  umn in pVector. 
3690: 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a 20 20 20     ** iTable:   
36a0: 20 20 20 20 20 20 20 30 20 6f 72 20 74 68 65 20         0 or the 
36b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
36c0: 73 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  s on the LHS of 
36d0: 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20  an assignment.  
36e0: 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62    ** pLeft->iTab
36f0: 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e 20 61  le:   First in a
3700: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
3710: 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
3720: 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20  lt, or 0.    ** 
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
3750: 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70 75 74  s not yet comput
3760: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
3770: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  * sqlite3ExprDel
3780: 65 74 65 28 29 20 73 70 65 63 69 66 69 63 61 6c  ete() specifical
3790: 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72 65 63  ly skips the rec
37a0: 75 72 73 69 76 65 20 64 65 6c 65 74 65 20 6f 66  ursive delete of
37b0: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e  .    ** pLeft on
37c0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
37d0: 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20 70 52  N nodes.  But pR
37e0: 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64  ight is followed
37f0: 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20 20 20  , so pVector.   
3800: 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74 61 63   ** can be attac
3810: 68 65 64 20 74 6f 20 70 52 69 67 68 74 20 74 6f  hed to pRight to
3820: 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f 64 65   cause this node
3830: 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72 73 68   to take ownersh
3840: 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65  ip of.    ** pVe
3850: 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c 6c 79  ctor.  Typically
3860: 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6d   there will be m
3870: 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43  ultiple TK_SELEC
3880: 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20  T_COLUMN nodes. 
3890: 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
38a0: 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e 74 65  ame pLeft pointe
38b0: 72 20 74 6f 20 74 68 65 20 70 56 65 63 74 6f 72  r to the pVector
38c0: 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f  , but only one o
38d0: 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69  f them.    ** wi
38e0: 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65 63 74  ll own the pVect
38f0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  or..    */.    p
3900: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  Ret = sqlite3PEx
3910: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45  pr(pParse, TK_SE
3920: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  LECT_COLUMN, 0, 
3930: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  0);.    if( pRet
3940: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   ){.      pRet->
3950: 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64  iColumn = iField
3960: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 4c  ;.      pRet->pL
3970: 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20  eft = pVector;. 
3980: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3990: 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74   pRet==0 || pRet
39a0: 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  ->iTable==0 );. 
39b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
39c0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
39d0: 56 45 43 54 4f 52 20 29 20 70 56 65 63 74 6f 72  VECTOR ) pVector
39e0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
39f0: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
3a00: 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74 20 3d  Expr;.    pRet =
3a10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3a20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 65 63  pParse->db, pVec
3a30: 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tor, 0);.  }.  r
3a40: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
3a50: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 28  ndif /* !define(
3a60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3a70: 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UERY) */../*.** 
3a80: 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
3a90: 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  xpr is of type T
3aa0: 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  K_SELECT, genera
3ab0: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
3ac0: 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72  ate.** it. Retur
3ad0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  n the register i
3ae0: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
3af0: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72  lt is stored (or
3b00: 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  , if the .** sub
3b10: 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
3b20: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
3b30: 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20  lumn, the first 
3b40: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f  in an array.** o
3b50: 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77  f registers in w
3b60: 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  hich the result 
3b70: 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a  is stored)..**.*
3b80: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f  * If pExpr is no
3b90: 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78  t a TK_SELECT ex
3ba0: 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e  pression, return
3bb0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3bc0: 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  t exprCodeSubsel
3bd0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
3be0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
3bf0: 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a  .  int reg = 0;.
3c00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3c10: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
3c20: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
3c30: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3c40: 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
3c50: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
3c60: 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
3c70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
3c80: 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn reg;.}../*.*
3c90: 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74  * Argument pVect
3ca0: 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  or points to a v
3cb0: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3cc0: 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56   - either a TK_V
3cd0: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53  ECTOR.** or TK_S
3ce0: 45 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72  ELECT that retur
3cf0: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
3d00: 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75   column. This fu
3d10: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
3d20: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  * the register n
3d30: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73  umber of a regis
3d40: 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ter that contain
3d50: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  s the value of.*
3d60: 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64  * element iField
3d70: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a   of the vector..
3d80: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
3d90: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20   is a TK_SELECT 
3da0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
3db0: 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73   code for it mus
3dc0: 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61  t have .** alrea
3dd0: 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  dy been generate
3de0: 64 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72  d using the expr
3df0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20  CodeSubselect() 
3e00: 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73  routine. In this
3e10: 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74  .** case paramet
3e20: 65 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f  er regSelect sho
3e30: 75 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74  uld be the first
3e40: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
3e50: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e  registers.** con
3e60: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  taining the resu
3e70: 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73  lts of the sub-s
3e80: 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  elect. .**.** If
3e90: 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74   pVector is of t
3ea0: 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74  ype TK_VECTOR, t
3eb0: 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65  hen code for the
3ec0: 20 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64   requested field
3ed0: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
3ee0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  . In this case (
3ef0: 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62  *pRegFree) may b
3f00: 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  e set to the num
3f10: 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ber of.** a temp
3f20: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
3f30: 6f 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  o be freed by th
3f40: 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20  e caller before 
3f50: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
3f60: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3f70: 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  g, output parame
3f80: 74 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73  ter (*ppExpr) is
3f90: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
3fa0: 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a   the.** Expr obj
3fb0: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3fc0: 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c  g to element iEl
3fd0: 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  em of the vector
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ff0: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4000: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4010: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
4020: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4030: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
4040: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
4060: 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74  ector to extract
4070: 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f   element from */
4080: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20  .  int iField,  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65     /* Field to e
40b0: 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63  xtract from pVec
40c0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tor */.  int reg
40d0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20  Select,         
40e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
40f0: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  t in array of re
4100: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70  gisters */.  Exp
4110: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4130: 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20  OUT: Expression 
4140: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
4150: 20 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20   *pRegFree      
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4170: 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74  OUT: Temp regist
4180: 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b  er to free */.){
4190: 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74  .  u8 op = pVect
41a0: 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74  or->op;.  assert
41b0: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
41c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
41d0: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c  ER || op==TK_SEL
41e0: 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  ECT );.  if( op=
41f0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
4200: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71      *ppExpr = sq
4210: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
4220: 53 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c  Subexpr(pVector,
4230: 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65   iField);.    re
4240: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54  turn pVector->iT
4250: 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d  able+iField;.  }
4260: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
4270: 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45  LECT ){.    *ppE
4280: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4290: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
42a0: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
42b0: 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72  r;.     return r
42c0: 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b  egSelect+iField;
42d0: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
42e0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73   pVector->x.pLis
42f0: 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  t->a[iField].pEx
4300: 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  pr;.  return sql
4310: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
4320: 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72  (pParse, *ppExpr
4330: 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a  , pRegFree);.}..
4340: 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
4350: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
4360: 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74  arison between t
4370: 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73  wo vector values
4380: 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  . Compute.** the
4390: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63   result of the c
43a0: 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c  omparison (1, 0,
43b0: 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72   or NULL) and wr
43c0: 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  ite that.** resu
43d0: 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  lt into register
43e0: 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   dest..**.** The
43f0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74   caller must sat
4400: 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  isfy the followi
4410: 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73  ng preconditions
4420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45  :.**.**    if pE
4430: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20  xpr->op==TK_IS: 
4440: 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61       op==TK_EQ a
4450: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
4460: 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45  LLEQ.**    if pE
4470: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4480: 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61  T:   op==TK_NE a
4490: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
44a0: 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72  LLEQ.**    other
44b0: 77 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20  wise:           
44c0: 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e       op==pExpr->
44d0: 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a  op and p5==0.*/.
44e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
44f0: 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20  VectorCompare(. 
4500: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4510: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67         /* Code g
4520: 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74  enerator context
4530: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
4540: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
4550: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
4560: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
4570: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20   dest,          
4580: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
4590: 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lts into this re
45a0: 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f  gister */.  u8 o
45b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
45c0: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
45d0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38  operator */.  u8
45e0: 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20   p5             
45f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
4600: 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a  LLEQ or zero */.
4610: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
4620: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4630: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
4640: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78  xpr->pLeft;.  Ex
4650: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
4660: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e  pr->pRight;.  in
4670: 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  t nLeft = sqlite
4680: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
4690: 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
46a0: 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d  .  int regLeft =
46b0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67   0;.  int regRig
46c0: 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78  ht = 0;.  u8 opx
46d0: 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64   = op;.  int add
46e0: 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  rDone = sqlite3V
46f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4700: 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73  ..  if( nLeft!=s
4710: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4720: 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a  Size(pRight) ){.
4730: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4740: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
4750: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
4760: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4770: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  }.  assert( pExp
4780: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
47a0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
47b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
47c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47d0: 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  NOT .       || p
47e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
47f0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4800: 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _GT .       || p
4810: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
4820: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4830: 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  _GE .  );.  asse
4840: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f  rt( pExpr->op==o
4850: 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d  p || (pExpr->op=
4860: 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b  =TK_IS && op==TK
4870: 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ).           
4880: 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
4890: 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d  TK_ISNOT && op==
48a0: 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65  TK_NE) );.  asse
48b0: 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78  rt( p5==0 || pEx
48c0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20  pr->op!=op );.  
48d0: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
48e0: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
48f0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
4900: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
4910: 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78  OREP2;.  if( opx
4920: 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20  ==TK_LE ) opx = 
4930: 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78  TK_LT;.  if( opx
4940: 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20  ==TK_GE ) opx = 
4950: 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66  TK_GT;..  regLef
4960: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4970: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4980: 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74  eft);.  regRight
4990: 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65   = exprCodeSubse
49a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52 69  lect(pParse, pRi
49b0: 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ght);..  for(i=0
49c0: 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73  ; 1 /*Loop exits
49d0: 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69   by "break"*/; i
49e0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
49f0: 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72  Free1 = 0, regFr
4a00: 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70  ee2 = 0;.    Exp
4a10: 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20  r *pL, *pR; .   
4a20: 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
4a30: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4a40: 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20   i<nLeft );.    
4a50: 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65  if( i>0 ) sqlite
4a60: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
4a70: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 31 20 3d  Parse);.    r1 =
4a80: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4a90: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ter(pParse, pLef
4aa0: 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20 26  t, i, regLeft, &
4ab0: 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pL, &regFree1);.
4ac0: 20 20 20 20 72 32 20 3d 20 65 78 70 72 56 65 63      r2 = exprVec
4ad0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4ae0: 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c 20 72  se, pRight, i, r
4af0: 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20 26 72  egRight, &pR, &r
4b00: 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 63 6f  egFree2);.    co
4b10: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
4b20: 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20 72  , pL, pR, opx, r
4b30: 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35 29  1, r2, dest, p5)
4b40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4b50: 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
4b60: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4b70: 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Lt);.    test
4b80: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
4b90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ba0: 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
4bb0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4bc0: 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
4bd0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
4be0: 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
4bf0: 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
4c00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4c10: 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74 65  ==OP_Ge);.    te
4c20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
4c30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4c40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
4c50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4c60: 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
4c70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4c80: 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  _Ne);.    sqlite
4c90: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4ca0: 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
4cb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
4cc0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4cd0: 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
4ce0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 73 71      if( i>0 ) sq
4cf0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
4d00: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  p(pParse);.    i
4d10: 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b  f( i==nLeft-1 ){
4d20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d30: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 78 3d    }.    if( opx=
4d40: 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =TK_EQ ){.      
4d50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d60: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64  2(v, OP_IfNot, d
4d70: 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20  est, addrDone); 
4d80: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4d90: 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c  .      p5 |= SQL
4da0: 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20  ITE_KEEPNULL;.  
4db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78 3d    }else if( opx=
4dc0: 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20  =TK_NE ){.      
4dd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4de0: 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74  2(v, OP_If, dest
4df0: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
4e00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4e10: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
4e20: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
4e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
4e40: 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  rt( op==TK_LT ||
4e50: 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70   op==TK_GT || op
4e60: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54  ==TK_LE || op==T
4e70: 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73 71  K_GE );.      sq
4e80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4e90: 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c  v, OP_ElseNotEq,
4ea0: 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20   0, addrDone);. 
4eb0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4ec0: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54  eIf(v, op==TK_LT
4ed0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
4ef0: 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
4f00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
4f10: 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20  p==TK_LE);.     
4f20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4f30: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  v, op==TK_GE);. 
4f40: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66       if( i==nLef
4f50: 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a  t-2 ) opx = op;.
4f60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4f70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
4f80: 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65 29  bel(v, addrDone)
4f90: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
4fa0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
4fb0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
4fc0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67  t argument nHeig
4fd0: 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ht is less than 
4fe0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
4ff0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65  maximum.** expre
5000: 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f  ssion depth allo
5010: 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  wed. If it is no
5020: 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  t, leave an erro
5030: 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20  r message in.** 
5040: 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  pParse..*/.int s
5050: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
5060: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
5070: 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74  rse, int nHeight
5080: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5090: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d  LITE_OK;.  int m
50a0: 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65  xHeight = pParse
50b0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
50c0: 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
50d0: 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65  EPTH];.  if( nHe
50e0: 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b  ight>mxHeight ){
50f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5100: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
5110: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
5120: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
5130: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
5140: 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74  h %d)", mxHeight
5150: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
5160: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5180: 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  }../* The follow
5190: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
51a0: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
51b0: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
51c0: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
51d0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
51e0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
51f0: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
5200: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
5210: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
5220: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
5230: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
5240: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
5250: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5260: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
5270: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
5280: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5290: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
52a0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
52b0: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
52c0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
52d0: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
52e0: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
52f0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
5320: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5330: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
5340: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
5350: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
5360: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
5370: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
5380: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5390: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
53a0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
53b0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
53c0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
53d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
53e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
53f0: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
5400: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
5410: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5420: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
5430: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
5440: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
5450: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5460: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
5470: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
5480: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
5490: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
54a0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
54b0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54c0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
54d0: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
54e0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
54f0: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
5500: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5510: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5520: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
5530: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5540: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
5550: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5560: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5570: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
5580: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5590: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
55a0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
55b0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
55c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
55d0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
55e0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
55f0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5600: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5610: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5620: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5630: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5640: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5650: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5660: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
5670: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
5680: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
5690: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
56a0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
56b0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
56c0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
56d0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
56e0: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
56f0: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5700: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5710: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5720: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5740: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5750: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5760: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5770: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5780: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5790: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
57a0: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
57b0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
57c0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
57d0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
57e0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
57f0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5800: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5810: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5820: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5830: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5840: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5850: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5860: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5880: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5890: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
58a0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
58b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
58c0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
58d0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
58e0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
58f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5900: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5910: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5920: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5930: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5940: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5950: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5960: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5970: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5980: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5990: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
59a0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
59b0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
59c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
59d0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
59e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
59f0: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5a00: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5a10: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5a20: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5a30: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5a40: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5a50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5a60: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5a70: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5a80: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5a90: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5aa0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5ab0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5ac0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5ad0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5ae0: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5af0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5b00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5b10: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5b20: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5b30: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5b40: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5b50: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5b60: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5b70: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5b80: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5b90: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5ba0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5bb0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5bc0: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5bd0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5be0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5bf0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5c00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5c10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5c20: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5c30: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5c40: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5c50: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5c60: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5c70: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5c80: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5c90: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
5ca0: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
5cb0: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
5cc0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
5cd0: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
5ce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5cf0: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
5d00: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
5d10: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
5d20: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
5d30: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
5d40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
5d50: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
5d60: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
5d70: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
5d80: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
5d90: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
5da0: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
5db0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
5dc0: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
5dd0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
5de0: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
5df0: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
5e00: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
5e10: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
5e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
5e30: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
5e40: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
5e50: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
5e60: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
5e70: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
5e80: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
5e90: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
5ea0: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
5eb0: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
5ec0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
5ed0: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
5ee0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
5ef0: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
5f00: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
5f10: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
5f20: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
5f30: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
5f40: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
5f50: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
5f60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
5f70: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
5f80: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
5f90: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
5fa0: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
5fb0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
5fc0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
5fd0: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
5fe0: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
5ff0: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6000: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6010: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6020: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6030: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
6040: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
6050: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
6060: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
6070: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
6080: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
6090: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
60a0: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
60b0: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
60c0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
60d0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
60e0: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
60f0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6100: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6110: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6120: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6130: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6140: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6150: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6160: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6170: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
6180: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6190: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
61a0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
61b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
61c0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
61d0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
61e0: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
61f0: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6200: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6210: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6220: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6230: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6240: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6250: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6260: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
6270: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
6280: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
6290: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
62a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
62b0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
62c0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
62d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
62e0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
62f0: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6300: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6310: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6320: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6330: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6340: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6350: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6360: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
6370: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
6380: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6390: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
63a0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
63b0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
63c0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
63d0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
63e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
63f0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
6400: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
6410: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
6420: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
6430: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
6440: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
6450: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
6460: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
6470: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
6480: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
6490: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
64a0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
64b0: 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28   sqlite3Isquote(
64c0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
64d0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
64e0: 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  if( pNew->u.zTok
64f0: 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65  en[0]=='"' ) pNe
6500: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
6510: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
6520: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6530: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
6540: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
6550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
6560: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
6570: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
6580: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
6590: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
65a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
65b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
65c0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
65d0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
65e0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
65f0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
6600: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
6610: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
6620: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
6630: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6640: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6650: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6660: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
6670: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
6680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6690: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
66a0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
66b0: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
66c0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
66d0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
66e0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
66f0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
6700: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
6710: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
6720: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
6730: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
6740: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6750: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
6760: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
6770: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6780: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
6790: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
67a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
67b0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
67c0: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
67d0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
67e0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
67f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6800: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6810: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6820: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6830: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6840: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
6850: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
6860: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
6870: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
6880: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
6890: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
68a0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
68b0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
68c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
68d0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
68e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
68f0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6900: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6910: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6920: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6930: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
6940: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6950: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
6960: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
6970: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
6980: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6990: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
69a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
69b0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
69c0: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
69d0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
69e0: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
69f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6a00: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6a10: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6a20: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6a30: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
6a40: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
6a50: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
6a60: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
6a70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6a80: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
6a90: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6aa0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6ab0: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6ac0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6ad0: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6ae0: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6af0: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6b00: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6b10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6b20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6b30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6b40: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6b50: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6b60: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6b70: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6b80: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6b90: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6ba0: 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20   *pRight        
6bb0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6bc0: 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  rand */.){.  Exp
6bd0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
6be0: 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65  TK_AND && pParse
6bf0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
6c00: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
6c10: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
6c20: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
6c30: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
6c40: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
6c50: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6c60: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
6c70: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6c80: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
6c90: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
6ca0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  e->db, sizeof(Ex
6cb0: 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20  pr));.    if( p 
6cc0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
6cd0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
6ce0: 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70  r));.      p->op
6cf0: 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41   = op & TKFLG_MA
6d00: 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67  SK;.      p->iAg
6d10: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  g = -1;.    }.  
6d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
6d30: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
6d40: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
6d50: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
6d60: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
6d70: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
6d80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
6d90: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
6da0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
6db0: 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20  .** Add pSelect 
6dc0: 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53  to the Expr.x.pS
6dd0: 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72  elect field.  Or
6de0: 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55  , if pExpr is NU
6df0: 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20  LL (due.** do a 
6e00: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6e10: 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20  n failure) then 
6e20: 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65  delete the pSele
6e30: 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ct object..*/.vo
6e40: 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41  id sqlite3PExprA
6e50: 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ddSelect(Parse *
6e60: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
6e70: 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  xpr, Select *pSe
6e80: 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78  lect){.  if( pEx
6e90: 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  pr ){.    pExpr-
6ea0: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  >x.pSelect = pSe
6eb0: 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65  lect;.    ExprSe
6ec0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
6ed0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50   EP_xIsSelect|EP
6ee0: 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  _Subquery);.    
6ef0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
6f00: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
6f10: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
6f20: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6f30: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
6f40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6f50: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6f60: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
6f70: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
6f80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
6f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6fa0: 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55  lways either TRU
6fb0: 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70  E or FALSE (resp
6fc0: 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68  ectively),.** th
6fd0: 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  en return 1.  If
6fe0: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65   one cannot dete
6ff0: 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20  rmine the truth 
7000: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
7010: 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f  expression at co
7020: 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72  mpile-time retur
7030: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  n 0..**.** This 
7040: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
7050: 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f  on.  If is OK to
7060: 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65   return 0 here e
7070: 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78  ven if.** the ex
7080: 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20  pression really 
7090: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
70a0: 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73  or false (a fals
70b0: 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20  e negative)..** 
70c0: 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20  But it is a bug 
70d0: 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74  to return 1 if t
70e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
70f0: 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ght have differe
7100: 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  nt.** boolean va
7110: 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e  lues in differen
7120: 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20  t circumstances 
7130: 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76  (a false positiv
7140: 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  e.).**.** Note t
7150: 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65  hat if the expre
7160: 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ssion is part of
7170: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72   conditional for
7180: 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c   a.** LEFT JOIN,
7190: 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
71a0: 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d  determine at com
71b0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
71c0: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69  r or not.** is i
71d0: 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c  t true or false,
71e0: 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72   so always retur
71f0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
7200: 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  nt exprAlwaysTru
7210: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
7220: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7230: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7240: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7250: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7260: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7270: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7290: 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69  rn v!=0;.}.stati
72a0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
72b0: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a  False(Expr *p){.
72c0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
72d0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
72e0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
72f0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
7300: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
7310: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
7320: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7330: 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a  return v==0;.}..
7340: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
7350: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
7360: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
7370: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
7380: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
7390: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
73a0: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
73b0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
73c0: 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   If one side or 
73d0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
73e0: 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   AND is known to
73f0: 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   be false, then 
7400: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65  instead.** of re
7410: 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65  turning an AND e
7420: 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20  xpression, just 
7430: 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e  return a constan
7440: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  t expression wit
7450: 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20  h.** a value of 
7460: 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a  false..*/.Expr *
7470: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
7480: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7490: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
74a0: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
74b0: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
74c0: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
74d0: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
74e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
74f0: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20   pLeft;.  }else 
7500: 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
7510: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78  lse(pLeft) || ex
7520: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
7530: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
7540: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7550: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
7560: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7570: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
7580: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7590: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
75a0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
75b0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
75c0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
75d0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
75e0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
75f0: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
7600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7610: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
7620: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
7630: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7640: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
7650: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
7660: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
7670: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
7680: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
7690: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
76a0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
76b0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
76c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
76d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
76e0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
76f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
7700: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7710: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
7720: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
7730: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7740: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
7750: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
7760: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
7770: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7780: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7790: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
77a0: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
77b0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
77c0: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
77d0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
77e0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
77f0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7810: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7820: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7830: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7840: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7850: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7860: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
7870: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
7880: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7890: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
78a0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
78b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
78c0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
78d0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
78e0: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
78f0: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
7900: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
7910: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
7920: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
7930: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7940: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7950: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7960: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
7970: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
7980: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
7990: 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20  oo big to avoid 
79a0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
79b0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
79c0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
79d0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
79e0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
79f0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7a00: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7a10: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7a20: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7a30: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7a40: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7a50: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7a60: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7a70: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7a80: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7a90: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7aa0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7ab0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7ac0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7ad0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7ae0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7af0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7b00: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7b10: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7b20: 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69  , u32 n){.  sqli
7b30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7b40: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
7b50: 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78  ar *z;.  ynVar x
7b60: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7b70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7b80: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7b90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7ba0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7bb0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7bc0: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7bd0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7be0: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7bf0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
7c10: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
7c20: 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  (z) );.  if( z[1
7c30: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
7c40: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7c50: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
7c60: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
7c70: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
7c80: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
7c90: 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79  ?' );.    x = (y
7ca0: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
7cb0: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
7cc0: 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20      int doAdd = 
7cd0: 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  0;.    if( z[0]=
7ce0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
7cf0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
7d00: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
7d10: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
7d20: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
7d30: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
7d40: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
7d50: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
7d60: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
7d70: 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33  bOk = 0==sqlite3
7d80: 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69  Atoi64(&z[1], &i
7d90: 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  , n-1, SQLITE_UT
7da0: 46 38 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  F8);.      x = (
7db0: 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74  ynVar)i;.      t
7dc0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7dd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7de0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7df0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7e00: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7e10: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7e20: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7e30: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7e40: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e50: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7e60: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7e70: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7e80: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7e90: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7ea0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7eb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7ec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ed0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ee0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
7ef0: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7f10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f30: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
7f40: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7f50: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
7f60: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
7f70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
7f80: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
7f90: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
7fa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
7fb0: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
7fc0: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
7fd0: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
7fe0: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
7ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8000: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8010: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
8020: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
8030: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
8040: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8050: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8060: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8070: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8080: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8090: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
80a0: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
80b0: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
80c0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
80d0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
80e0: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
80f0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
8100: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
8110: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
8120: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
8130: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
8140: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8150: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8160: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8170: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8180: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8190: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
81a0: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
81b0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
81c0: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
81d0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
81e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
81f0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
8200: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8210: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8230: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8240: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8250: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8260: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8270: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8280: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8290: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
82a0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
82b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
82c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
82d0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
82e0: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
82f0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
8300: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
8310: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
8320: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
8330: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
8340: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8350: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8360: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8370: 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
8380: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45  TE_DEBUG.  if( E
8390: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83a0: 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45  , EP_Leaf) && !E
83b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83c0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
83d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
83e0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
83f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
8400: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght==0 );.    as
8410: 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65  sert( p->x.pSele
8420: 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e  ct==0 );.  }.#en
8430: 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48  dif.  if( !ExprH
8440: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45  asProperty(p, (E
8450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
8460: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  eaf)) ){.    /* 
8470: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
8480: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
8490: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
84a0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
84b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
84c0: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
84d0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
84e0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
84f0: 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  && p->op!=TK_SEL
8500: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c  ECT_COLUMN ) sql
8510: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8520: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
8530: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8540: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69  elete(db, p->pRi
8550: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
8560: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8570: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
8580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
8590: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
85a0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
85b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
85c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
85d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
85e0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
85f0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8600: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
8610: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
8620: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
8630: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  zToken);.  if( !
8640: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8650: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
8660: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8670: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
8680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8690: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
86a0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
86b0: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
86c0: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
86d0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
86e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
86f0: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8700: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8710: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8720: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8730: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8740: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
8750: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
8760: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
8770: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
8780: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
87a0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
87b0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
87c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
87d0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
87e0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
87f0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8800: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8810: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8820: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8830: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8840: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8850: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
8860: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
8870: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
8880: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
8890: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
88a0: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
88b0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
88c0: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
88d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
88e0: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
88f0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8900: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8910: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8920: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8930: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8940: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
8950: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
8960: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
8970: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
8980: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
8990: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
89a0: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
89b0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
89c0: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
89d0: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
89e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
8a30: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
8a40: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
8a50: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
8a60: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
8a70: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
8a80: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
8a90: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
8aa0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8ab0: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
8ac0: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
8ad0: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
8ae0: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
8af0: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
8b00: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
8b10: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
8b20: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
8b30: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
8b40: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
8b50: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
8b60: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
8b70: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
8b80: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
8b90: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
8ba0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
8bb0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
8bc0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8bd0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
8be0: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
8bf0: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
8c00: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
8c10: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c20: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
8c30: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
8c40: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
8c50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
8c60: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
8c70: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
8c80: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
8c90: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
8ca0: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
8cb0: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
8cc0: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
8cd0: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
8ce0: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
8cf0: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
8d00: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
8d10: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
8d20: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
8d30: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
8d40: 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20  er parts of teh 
8d50: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
8d60: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
8d70: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
8d80: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
8d90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
8da0: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
8db0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
8dc0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
8dd0: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
8de0: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
8df0: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
8e00: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
8e10: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
8e20: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
8e30: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
8e40: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
8e50: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
8e60: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
8e70: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8e80: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
8e90: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
8ea0: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
8eb0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
8ec0: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
8ed0: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
8ee0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
8ef0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
8f00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
8f10: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
8f20: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
8f30: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
8f40: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
8f50: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
8f60: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
8f70: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
8f80: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
8f90: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
8fa0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
8fb0: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
8fc0: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
8fd0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
8fe0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
8ff0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
9000: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
9010: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
9020: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9030: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
9040: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
9050: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9060: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9070: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
9080: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9090: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
90a0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
90b0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
90c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
90d0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
90e0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
90f0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
9100: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9110: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9120: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
9130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9140: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
9150: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
9160: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
9170: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
9180: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
9190: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
91a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
91b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
91c0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
91d0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
91e0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
91f0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
9200: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
9210: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
9220: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
9230: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
9240: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
9250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9260: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9270: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9280: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9290: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
92a0: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
92b0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
92c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
92d0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
92e0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
92f0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
9300: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9310: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
9320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
9330: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
9340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9350: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9360: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
9370: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
9380: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
9390: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
93a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
93b0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
93c0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
93d0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
93e0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
93f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
9400: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
9410: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
9420: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
9430: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
9440: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
9450: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
9460: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
9470: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
9480: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
9490: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
94a0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
94b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
94c0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
94d0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
94e0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
94f0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
9500: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
9510: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
9520: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
9530: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
9540: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
9550: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
9560: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
9570: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
9580: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
9590: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
95a0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
95b0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
95c0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
95d0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
95e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
95f0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9600: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
9610: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
9620: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
9630: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
9640: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
9650: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
9660: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
9670: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
9680: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9690: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
96a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
96b0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
96c0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
96d0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
96e0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
96f0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9700: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9710: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9720: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9730: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9740: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9750: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
9760: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
9770: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
9780: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
9790: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
97a0: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
97b0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
97c0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
97d0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
97e0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
97f0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9800: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
9810: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
9820: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
9830: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
9840: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
9850: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
9860: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
9870: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
9880: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
9890: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
98a0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
98b0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
98c0: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
98d0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
98e0: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
98f0: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
9900: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
9910: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
9920: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
9930: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
9940: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
9950: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
9960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
9980: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
9990: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
99a0: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
99b0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
99c0: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
99d0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
99e0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
99f0: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
9a00: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
9a10: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
9a20: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
9a30: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
9a40: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9a50: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
9a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
9a70: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
9a80: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
9a90: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
9aa0: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
9ab0: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
9ac0: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
9ad0: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
9ae0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
9af0: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
9b00: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
9b10: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
9b20: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
9b30: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
9b40: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
9b50: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
9b60: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9b70: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
9b80: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
9b90: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
9ba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9bb0: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
9bc0: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
9bd0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
9be0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
9bf0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
9c00: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
9c10: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
9c20: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9c30: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9c40: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
9c50: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
9c60: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
9c70: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
9c80: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9c90: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9ca0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9cb0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
9cc0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
9cd0: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
9ce0: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
9cf0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
9d00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9d10: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
9d30: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9d40: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
9d50: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9d60: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
9d70: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9d80: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
9d90: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
9da0: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
9db0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9dc0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
9dd0: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
9de0: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
9df0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
9e00: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
9e10: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
9e20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9e30: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
9e40: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
9e50: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
9e60: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
9e70: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
9e80: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9e90: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
9ea0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
9eb0: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
9ec0: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
9ed0: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
9ee0: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
9ef0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
9f00: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
9f10: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
9f20: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
9f30: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
9f40: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
9f50: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
9f60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9f70: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
9f80: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
9f90: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
9fa0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
9fb0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
9fc0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
9fd0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
9fe0: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
9ff0: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a010: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a020: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a030: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a040: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a050: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a060: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a070: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a090: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a0a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a0b0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a0c0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0e0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a0f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a100: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a110: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a120: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a130: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a140: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a150: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a160: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a180: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a190: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a1a0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a1b0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a1c0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a1d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a1e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a1f0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a200: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a210: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a220: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a230: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a240: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a250: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a260: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a270: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a280: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a2b0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a2c0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a2d0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a2e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a2f0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a300: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a310: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a330: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a340: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a350: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a360: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a370: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a380: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a390: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a3a0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a3c0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
a3d0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
a3e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a3f0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
a400: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
a410: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
a420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a430: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a440: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a450: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a470: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a480: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a490: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a4a0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a4b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a4c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a4d0: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a4e0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a4f0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a500: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a510: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a520: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a530: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a540: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a550: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a560: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a570: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a580: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a590: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a5a0: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a5b0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a5c0: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a5d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a5e0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a5f0: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a600: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a610: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a620: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a630: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a640: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a650: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a660: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a670: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a690: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a6a0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a6b0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a6c0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a6d0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a6e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a6f0: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a700: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a710: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a720: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a730: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a740: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a750: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a760: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a770: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a780: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a790: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a7a0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a7b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a7c0: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a7d0: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a7e0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a7f0: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a800: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a810: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a820: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a830: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a840: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a850: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a860: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a870: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a880: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a890: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a8a0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a8b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a8c0: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a8d0: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a8e0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a8f0: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a900: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a910: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a920: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a930: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a940: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a950: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a960: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a970: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a980: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a990: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a9a0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a9b0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a9c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
a9d0: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
a9e0: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
a9f0: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
aa00: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
aa10: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
aa20: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
aa30: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa40: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa50: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aa60: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aa70: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aa80: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aa90: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aaa0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aab0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aac0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
aad0: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
aae0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
aaf0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
ab00: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
ab10: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
ab20: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
ab30: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab40: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab50: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
ab60: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
ab70: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
ab80: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
ab90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
aba0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
abb0: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
abc0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
abd0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
abe0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
abf0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
ac00: 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43  r *pPriorSelectC
ac10: 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ol = 0;.  assert
ac20: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
ac30: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
ac40: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
ac50: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
ac60: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
ac70: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
ac80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ac90: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69   pNew->nExpr = i
aca0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69   = p->nExpr;.  i
acb0: 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52  f( (flags & EXPR
acc0: 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29  DUP_REDUCE)==0 )
acd0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
ace0: 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20  Expr; i+=i){}.  
acf0: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
ad00: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ad10: 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69  cRawNN(db,  i*si
ad20: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
ad30: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
ad40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
ad50: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
ad60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ad70: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
ad80: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
ad90: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
ada0: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
adb0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
adc0: 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c   *pOldExpr = pOl
add0: 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  dItem->pExpr;.  
ade0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
adf0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
ae00: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
ae10: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
ae20: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
ae30: 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20  ( pOldExpr .    
ae40: 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70   && pOldExpr->op
ae50: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
ae60: 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77  MN.     && (pNew
ae70: 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
ae80: 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  xpr)!=0 .    ){.
ae90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
aea0: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
aeb0: 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20  =0 || i>0 );.   
aec0: 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d     if( pNewExpr-
aed0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
aee0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
aef0: 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  OldExpr->pLeft==
af00: 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74  pOldExpr->pRight
af10: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
af20: 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e  orSelectCol = pN
af30: 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ewExpr->pLeft = 
af40: 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74  pNewExpr->pRight
af50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
af60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
af70: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
af80: 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e  sert( pItem[-1].
af90: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
afa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
afb0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
afc0: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
afd0: 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20  iColumn+1 );.   
afe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
aff0: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49  iorSelectCol==pI
b000: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70  tem[-1].pExpr->p
b010: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Left );.        
b020: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b030: 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  = pPriorSelectCo
b040: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b050: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
b060: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b070: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b080: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
b090: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
b0a0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b0b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
b0c0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
b0d0: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
b0e0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
b0f0: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
b100: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
b110: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
b120: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
b130: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
b140: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
b150: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
b170: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
b180: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
b190: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
b1a0: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
b1b0: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
b1c0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
b1d0: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
b1e0: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
b1f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
b200: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
b210: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b220: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
b230: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
b240: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
b250: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
b260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
b270: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b280: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
b290: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
b2a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
b2b0: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
b2c0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b2d0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
b2e0: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
b2f0: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
b300: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
b310: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b320: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
b330: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b340: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
b350: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
b360: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
b370: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
b380: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
b390: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b3a0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b3b0: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
b3c0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
b3d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
b3e0: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
b3f0: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
b400: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
b410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
b420: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b430: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
b440: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
b450: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b460: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b470: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
b480: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
b490: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
b4a0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
b4b0: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
b4c0: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
b4d0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b4e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
b4f0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
b500: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b510: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b520: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b530: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b540: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
b550: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b560: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
b570: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
b580: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
b590: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b5a0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
b5b0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
b5c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
b5d0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
b5e0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
b5f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
b600: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
b610: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
b620: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
b630: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
b640: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
b650: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
b660: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b670: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b680: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
b690: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
b6a0: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
b6b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
b6c0: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
b6d0: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
b6e0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
b6f0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b700: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
b710: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b720: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b730: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
b740: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
b750: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
b760: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
b770: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
b780: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
b790: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
b7a0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
b7b0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
b7c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
b7d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
b7e0: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
b7f0: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
b800: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b810: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
b820: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
b830: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
b840: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b850: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b860: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
b870: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
b880: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
b890: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
b8a0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
b8b0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
b8c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
b8d0: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
b8e0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b8f0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
b900: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b910: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b920: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b930: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b940: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
b950: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b970: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
b980: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
b990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b9a0: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
b9b0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
b9c0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
b9d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
b9e0: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
b9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ba00: 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61   }.  /* Note tha
ba10: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69  t because the si
ba20: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
ba30: 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20  tion for p->a[] 
ba40: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
ba50: 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20  ssarily a power 
ba60: 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49  of two, sqlite3I
ba70: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61  dListAppend() ma
ba80: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a  y not be called.
ba90: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c    ** on the dupl
baa0: 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79  icate created by
bab0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
bac0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
bad0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
bae0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
baf0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
bb00: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
bb10: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
bb20: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
bb30: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
bb40: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
bb50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bb60: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bb70: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
bb80: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
bb90: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
bba0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
bbb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
bbc0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
bbd0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
bbe0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
bbf0: 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72  lect *pNew, *pPr
bc00: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ior;.  assert( d
bc10: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
bc20: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bc30: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bc40: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bc50: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
bc60: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
bc70: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
bc80: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
bc90: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
bca0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
bcb0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
bcc0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
bcd0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
bce0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
bcf0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
bd00: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
bd10: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
bd20: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
bd30: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
bd40: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
bd50: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
bd60: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
bd70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bd80: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
bd90: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bda0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
bdb0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bdc0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
bdd0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
bde0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
bdf0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
be00: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
be10: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
be20: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
be30: 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
be40: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
be50: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  w;.  pNew->pNext
be60: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
be70: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
be80: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
be90: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
bea0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
beb0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bec0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
bed0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
bee0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
bef0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
bf00: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
bf10: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
bf20: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
bf30: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  l;.  pNew->addrO
bf40: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
bf50: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
bf60: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
bf70: 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f   pNew->nSelectRo
bf80: 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w = p->nSelectRo
bf90: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  w;.  pNew->pWith
bfa0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
bfb0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69  ->pWith);.  sqli
bfc0: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
bfd0: 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61  (pNew, p->zSelNa
bfe0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  me);.  return pN
bff0: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
c000: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c010: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c020: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
c030: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
c040: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
c050: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
c060: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
c070: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
c080: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
c090: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
c0a0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
c0b0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
c0c0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
c0d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
c0e0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
c0f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
c100: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
c110: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
c120: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
c130: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
c140: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
c150: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
c160: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
c170: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
c180: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
c190: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
c1a0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
c1b0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c1c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c1d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
c1e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c1f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
c200: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
c210: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
c220: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
c230: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
c240: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
c250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c260: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
c270: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c280: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
c290: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c2a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c2b0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
c2c0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
c2d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c2e0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c2f0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
c300: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c310: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c320: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c330: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
c340: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
c350: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c360: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
c370: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
c380: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
c390: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
c3a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
c3b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
c3c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
c3d0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
c3e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c3f0: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
c400: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
c410: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
c420: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
c430: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
c440: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
c450: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
c460: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c470: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
c480: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
c490: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
c4a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
c4b0: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
c4c0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
c4d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
c4e0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c4f0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
c500: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
c510: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
c520: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
c530: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
c540: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
c550: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
c560: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
c570: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
c580: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
c590: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
c5a0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
c5b0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
c5c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
c5d0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
c5e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
c5f0: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
c600: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
c610: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
c620: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
c630: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
c640: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
c650: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
c660: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
c670: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
c680: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
c690: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
c6a0: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
c6b0: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
c6c0: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
c6d0: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
c6e0: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
c6f0: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
c700: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c710: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
c720: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
c730: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
c740: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
c750: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
c760: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
c770: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
c780: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
c790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c7a0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
c7b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c7d0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
c7e0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c7f0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c800: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
c810: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
c820: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
c830: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
c840: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
c850: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c860: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
c870: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
c880: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
c890: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
c8a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c8b0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
c8c0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
c8d0: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
c8e0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
c8f0: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
c900: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
c910: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
c920: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
c930: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
c940: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
c950: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
c960: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
c970: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
c980: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
c990: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c9a0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c9b0: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
c9c0: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
c9d0: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
c9e0: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
c9f0: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
ca00: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
ca10: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
ca20: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
ca30: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
ca40: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
ca50: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
ca60: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
ca70: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
ca80: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
ca90: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
caa0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
cab0: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
cac0: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
cad0: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
cae0: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
caf0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
cb00: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
cb10: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
cb20: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
cb30: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
cb40: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
cb50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
cb60: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
cb70: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
cb80: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
cba0: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
cbb0: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
cbc0: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
cbd0: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
cbe0: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
cbf0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cc00: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
cc10: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
cc20: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
cc30: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
cc40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
cc50: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
cc60: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
cc70: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
cc80: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cc90: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
cca0: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
ccb0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
ccc0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
ccd0: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
cce0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
ccf0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
cd00: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
cd10: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
cd20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
cd30: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   ){.    if( pLis
cd40: 74 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 46  t && pList->a[iF
cd50: 69 72 73 74 5d 2e 70 45 78 70 72 20 29 7b 0a 20  irst].pExpr ){. 
cd60: 20 20 20 20 20 45 78 70 72 20 2a 70 46 69 72 73       Expr *pFirs
cd70: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  t = pList->a[iFi
cd80: 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  rst].pExpr;.    
cd90: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
cda0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
cdb0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a  COLUMN );.     .
cdc0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
cdd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cde0: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
cdf0: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
ce00: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  ted when.      *
ce10: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  * sqlite3ExprLis
ce20: 74 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c  tDelete() is cal
ce30: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  led */.      pFi
ce40: 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45  rst->pRight = pE
ce50: 78 70 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72  xpr;.      pExpr
ce60: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
ce70: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a  Remember the siz
ce80: 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
ce90: 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77  iTable so that w
cea0: 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74  e can check that
ceb0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48  .      ** the RH
cec0: 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20  S and LHS sizes 
ced0: 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64  match during cod
cee0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f  e generation. */
cef0: 0a 20 20 20 20 20 20 70 46 69 72 73 74 2d 3e 69  .      pFirst->i
cf00: 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73  Table = pColumns
cf10: 2d 3e 6e 49 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nId;.    }.  }
cf20: 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  ..vector_append_
cf30: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
cf40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
cf50: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
cf60: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
cf70: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
cf80: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
cf90: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
cfa0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
cfb0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
cfc0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
cfd0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
cfe0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
cff0: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
d000: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
d010: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
d020: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d030: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
d040: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
d050: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
d060: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
d070: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
d080: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
d090: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
d0a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d0b0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
d0c0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
d0d0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
d0e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
d0f0: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d100: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
d110: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
d120: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
d130: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
d140: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
d150: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
d160: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
d170: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d180: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
d190: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
d1a0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
d1b0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
d1c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
d1d0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
d1e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d1f0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
d200: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d210: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
d220: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
d230: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
d240: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
d250: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
d260: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d270: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d280: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
d290: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
d2a0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d2b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
d2c0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
d2d0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
d2e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
d2f0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
d300: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
d310: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
d320: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
d330: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
d340: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
d350: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
d360: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
d370: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
d380: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d390: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
d3a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
d3b0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
d3c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d3d0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
d3e0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
d3f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
d400: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
d410: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
d420: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
d430: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
d440: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
d450: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
d460: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
d470: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d480: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
d490: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
d4a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
d4b0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
d4c0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
d4d0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
d4e0: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
d4f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
d500: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
d510: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
d520: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
d530: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
d540: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
d550: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d560: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
d570: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
d580: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d590: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
d5a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d5b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d5c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d5d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
d5e0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d5f0: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
d600: 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70  pan. */.  ExprSp
d610: 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20  an *pSpan       
d620: 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f    /* The span to
d630: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a   be added */.){.
d640: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d650: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
d660: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
d670: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
d680: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
d690: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
d6a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d6b0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
d6c0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d6d0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
d6e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
d6f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
d700: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d710: 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d  || pItem->pExpr=
d720: 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b  =pSpan->pExpr );
d730: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d740: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
d750: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
d760: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
d770: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
d780: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
d790: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
d7c0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
d7d0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d  n->zStart));.  }
d7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
d7f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d800: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
d810: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
d820: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
d830: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
d840: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
d850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d860: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
d870: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
d880: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
d890: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
d8a0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
d8b0: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
d8c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
d8d0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
d8e0: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
d8f0: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
d900: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
d910: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
d920: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
d930: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
d940: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
d950: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
d960: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d970: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d980: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
d990: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
d9a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d9b0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
d9c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d9d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
d9e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
d9f0: 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e   exprListDeleteN
da00: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
da10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
da20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
da30: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
da40: 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
da50: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
da60: 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
da70: 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  0 );.  for(pItem
da80: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
da90: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
daa0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
dab0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
dac0: 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
dad0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
dae0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
daf0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
db00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
db10: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
db20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
db30: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
db40: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
db50: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
db60: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
db70: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71  xprListDelete(sq
db80: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
db90: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
dba0: 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c  f( pList ) exprL
dbb0: 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  istDeleteNN(db, 
dbc0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
dbd0: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 77   Return the bitw
dbe0: 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78  ise-OR of all Ex
dbf0: 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20  pr.flags fields 
dc00: 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  in the given.** 
dc10: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32  ExprList..*/.u32
dc20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dc30: 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72  Flags(const Expr
dc40: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
dc50: 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d  int i;.  u32 m =
dc60: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
dc70: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
dc80: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
dc90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70  i++){.       Exp
dca0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
dcb0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
dcc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
dcd0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
dce0: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
dcf0: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  s;.    }.  }.  r
dd00: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
dd10: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
dd20: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
dd30: 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68  backs used to ch
dd40: 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20  eck expressions 
dd50: 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65  to.** see if the
dd60: 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22  y are "constant"
dd70: 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69   for some defini
dd80: 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74  tion of constant
dd90: 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72  .  The.** Walker
dda0: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74  .eCode value det
ddb0: 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65  ermines the type
ddc0: 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77   of "constant" w
ddd0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  e are looking.**
dde0: 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73   for..**.** Thes
ddf0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
de00: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
de10: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f  implement the fo
de20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
de30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
de40: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
de50: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
de60: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a  ker->eCode==1.**
de70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
de80: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
de90: 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70 57  n()           pW
dea0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a  alker->eCode==2.
deb0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
dec0: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
ded0: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
dee0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
def0: 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  3.**     sqlite3
df00: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
df10: 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20  Function()      
df20: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
df30: 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49  ==4 or 5.**.** I
df40: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65  n all cases, the
df50: 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57   callbacks set W
df60: 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e  alker.eCode=0 an
df70: 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20 65  d abort if the e
df80: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
df90: 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20  found to not be 
dfa0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  a constant..**.*
dfb0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70  * The sqlite3Exp
dfc0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
dfd0: 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20  ction() is used 
dfe0: 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65  for evaluating e
dff0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e  xpressions.** in
e000: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e010: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
e020: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
e030: 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61 72  ue is 5 when par
e040: 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74  sing.** an exist
e050: 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34  ing schema and 4
e060: 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   when processing
e070: 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   a new statement
e080: 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  .  A bound.** pa
e090: 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20 61  rameter raises a
e0a0: 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20  n error for new 
e0b0: 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20  statements, but 
e0c0: 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76  is silently conv
e0d0: 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  erted.** to NULL
e0e0: 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63   for existing sc
e0f0: 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c  hemas.  This all
e100: 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ows sqlite_maste
e110: 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a  r tables that .*
e120: 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e  * contain a boun
e130: 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63 61  d parameter beca
e140: 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67 65  use they were ge
e150: 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72  nerated by older
e160: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
e170: 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72  SQLite to be par
e180: 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  sed by newer ver
e190: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
e1a0: 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20  without raising 
e1b0: 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73  a.** malformed s
e1c0: 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a  chema error..*/.
e1d0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
e1e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
e1f0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
e200: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20  xpr *pExpr){..  
e210: 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65  /* If pWalker->e
e220: 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20 61  Code is 2 then a
e230: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
e240: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
e250: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
e260: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
e270: 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74  lauses of a left
e280: 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69   join disqualifi
e290: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
e2a0: 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e  n.  ** from bein
e2b0: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e  g considered con
e2c0: 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  stant. */.  if( 
e2d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e2e0: 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  2 && ExprHasProp
e2f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
e300: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
e310: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e320: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
e330: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
e340: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
e350: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  op ){.    /* Con
e360: 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  sider functions 
e370: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69  to be constant i
e380: 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75  f all their argu
e390: 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61  ments are consta
e3a0: 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69  nt.    ** and ei
e3b0: 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ther pWalker->eC
e3c0: 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74  ode==4 or 5 or t
e3d0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  he function has 
e3e0: 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  the.    ** SQLIT
e3f0: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61  E_FUNC_CONST fla
e400: 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  g. */.    case T
e410: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
e420: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
e430: 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48  Code>=4 || ExprH
e440: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
e450: 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29  ,EP_ConstFunc) )
e460: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
e470: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e490: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e4a0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
e4b0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61  ;.      }.    ca
e4d0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
e4e0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
e4f0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
e500: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
e510: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
e520: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e530: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
e540: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e550: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e560: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
e570: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e580: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
e590: 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
e5a0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e5b0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
e5c0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MN );.      if( 
e5d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e5e0: 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  3 && pExpr->iTab
e5f0: 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  le==pWalker->u.i
e600: 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cur ){.        r
e610: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
e620: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
e630: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
e640: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
e650: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e660: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
e670: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
e680: 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70  BLE:.      if( p
e690: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35  Walker->eCode==5
e6a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
e6b0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20  ilently convert 
e6c0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
e6d0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73   that appear ins
e6e0: 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20  ide of CREATE.  
e6f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
e700: 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20  nts into a NULL 
e710: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65  when parsing the
e720: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
e730: 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20  t text out.     
e740: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c     ** of the sql
e750: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e760: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
e770: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
e780: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e790: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e7a0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =4 ){.        /*
e7b0: 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   A bound paramet
e7c0: 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73  er in a CREATE s
e7d0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72  tatement that or
e7e0: 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20  iginates from.  
e7f0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
e800: 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65  _prepare() cause
e810: 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
e820: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e830: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e840: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e850: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e860: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
e870: 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  h */.    default
e880: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e8a0: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c  SELECT ); /* sel
e8b0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e8c0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
e8d0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
e8e0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e8f0: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65  _EXISTS ); /* se
e900: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e910: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
e920: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
e930: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
e950: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e960: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
e970: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
e980: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
e990: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
e9a0: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
e9b0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74  eCode = 0;.  ret
e9c0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
e9d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
e9e0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
e9f0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
ea00: 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
ea10: 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
ea20: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
ea30: 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e  ;.  w.eCode = in
ea40: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
ea50: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
ea60: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
ea70: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
ea80: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
ea90: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
eaa0: 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
eab0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
eac0: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ead0: 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
eae0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
eaf0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
eb00: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
eb10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eb20: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
eb30: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
eb40: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
eb50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
eb60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
eb70: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
eb80: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
eb90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
eba0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
ebb0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
ebc0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
ebd0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
ebe0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
ebf0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
ec00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec10: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
ec20: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
ec30: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
ec40: 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
ec50: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ec60: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
ec70: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
ec80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ec90: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
eca0: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
ecb0: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
ecc0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ecd0: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
ece0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
ecf0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ed00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
ed10: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
ed20: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
ed30: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
ed40: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ed50: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
ed60: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ed70: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ed80: 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
ed90: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
eda0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
edb0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
edc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
edd0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
ede0: 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
edf0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
ee00: 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
ee10: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
ee20: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
ee30: 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
ee40: 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
ee50: 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
ee60: 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
ee70: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
ee80: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ee90: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
eea0: 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
eeb0: 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
eec0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
eed0: 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a   3, iCur);.}../*
eee0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
eef0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
ef00: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
ef10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ef20: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
ef30: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
ef40: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
ef50: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
ef60: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
ef70: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
ef80: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
ef90: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
efa0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
efb0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
efc0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
efd0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
efe0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
eff0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
f000: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
f010: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
f020: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
f030: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f040: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
f050: 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e  Expr *p, u8 isIn
f060: 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  it){.  assert( i
f070: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e  sInit==0 || isIn
f080: 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  it==1 );.  retur
f090: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
f0a0: 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d   4+isInit, 0);.}
f0b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f0c0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
f0d0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  NTS./*.** Walk a
f0e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
f0f0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
f100: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
f110: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62  ontains a.** sub
f120: 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69  query of some ki
f130: 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  nd.  Return 0 if
f140: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
f150: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74  bqueries..*/.int
f160: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
f170: 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70  ainsSubquery(Exp
f180: 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
f190: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
f1a0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
f1b0: 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20   w.eCode = 1;.  
f1c0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
f1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
f1e0: 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
f1f0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
f200: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
f210: 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  t;.  sqlite3Walk
f220: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
f230: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30  eturn w.eCode==0
f240: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f250: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
f260: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
f270: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
f280: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
f290: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
f2a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
f2b0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
f2c0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
f2d0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
f2e0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
f2f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
f300: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
f310: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
f320: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
f330: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
f340: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
f350: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
f360: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
f370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f380: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
f390: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
f3a0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
f3b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
f3c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
f3d0: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
f3e0: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
f3f0: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
f400: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
f410: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
f420: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
f430: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
f440: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
f450: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
f460: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
f470: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
f480: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
f490: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
f4a0: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
f4b0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
f4c0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
f4d0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
f4e0: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
f4f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f500: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
f510: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f520: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
f530: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
f540: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
f550: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
f560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f570: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
f580: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
f590: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
f5a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f5b0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
f5c0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f5d0: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
f5e0: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
f5f0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
f600: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
f610: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
f630: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
f640: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f650: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
f660: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
f670: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
f680: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
f690: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
f6a0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
f6b0: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
f6c0: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
f6d0: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
f6e0: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
f6f0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
f700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f710: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
f720: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
f730: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
f740: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
f750: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
f760: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
f770: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
f780: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
f790: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
f7a0: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
f7b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
f7c0: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
f7d0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
f7e0: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
f7f0: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
f800: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
f810: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
f820: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
f830: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
f840: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
f850: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
f860: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
f870: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
f880: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
f890: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
f8a0: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
f8b0: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
f8c0: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
f8d0: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
f8e0: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
f8f0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
f900: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
f910: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
f920: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
f930: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
f940: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
f950: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
f960: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
f970: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
f980: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
f990: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
f9a0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
f9b0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
f9c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f9d0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
f9e0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
f9f0: 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p->pTab!=0 );.  
fa00: 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
fa10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
fa20: 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
fa40: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
fa50: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69  >pTab->aCol[p->i
fa60: 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
fa70: 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  =0);.    default
fa80: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
fa90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
faa0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
fab0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
fac0: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
fad0: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
fae0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
faf0: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
fb00: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
fb10: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
fb20: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
fb30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fb40: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
fb50: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
fb60: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
fb70: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
fb80: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
fb90: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
fba0: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
fbb0: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
fbc0: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
fbd0: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
fbe0: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
fbf0: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
fc00: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
fc10: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
fc20: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
fc30: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
fc40: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
fc50: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
fc60: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74  E_AFF_BLOB ) ret
fc70: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
fc80: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
fc90: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
fca0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
fcb0: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
fcc0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
fcd0: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
fce0: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
fcf0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
fd00: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
fd10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
fd20: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
fd30: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
fd40: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
fd50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fd60: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
fd70: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
fd80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
fd90: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
fda0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
fdb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
fdc0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
fdd0: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
fde0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
fdf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
fe00: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
fe10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
fe20: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
fe30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fe40: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
fe50: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
fe60: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
fe70: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
fe80: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
fe90: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
fea0: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
feb0: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
fec0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
fed0: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
fee0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
fef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ff00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ff10: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ff20: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
ff30: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
ff40: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
ff50: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
ff60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
ff70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ff80: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
ff90: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
ffa0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
ffb0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
ffc0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
ffd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
ffe0: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
fff0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
10000 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
10010 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52  *.** pX is the R
10020 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72  HS of an IN oper
10030 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20  ator.  If pX is 
10040 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10050 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  nt .** that can 
10060 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f  be simplified to
10070 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
10080 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74  access, then ret
10090 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
100a0 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73   to the SELECT s
100b0 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58  tatement.  If pX
100c0 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54   is not a SELECT
100d0 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f   statement,.** o
100e0 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  r if the SELECT 
100f0 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20  statement needs 
10100 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64  to be manifested
10110 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e   into a transien
10120 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e  t.** table, then
10130 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
10140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10150 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
10160 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43  atic Select *isC
10170 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
10180 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65  (Expr *pX){.  Se
10190 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69  lect *p;.  SrcLi
101a0 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
101b0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
101c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
101d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70  nt i;.  if( !Exp
101e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
101f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10200 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e   return 0;  /* N
10210 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  ot a subquery */
10220 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
10230 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61  operty(pX, EP_Va
10240 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75  rSelect)  ) retu
10250 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c  rn 0;  /* Correl
10260 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70  ated subq */.  p
10270 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
10280 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
10290 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
102a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
102b0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
102c0 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
102d0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
102e0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
102f0 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
10300 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
10310 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
10320 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
10330 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
10340 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10350 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
10360 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
10370 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
10380 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
10390 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
103a0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
103b0 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
103c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
103d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
103e0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10400 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
10410 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
10420 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
10430 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
10440 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
10450 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
10460 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
10470 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
10480 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
10490 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
104a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
104b0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104d0 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
104e0 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
104f0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
10500 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
10510 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
10520 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
10530 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
10540 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
10550 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
10560 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
10570 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10580 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
10590 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
105a0 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
105b0 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
105c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
105d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
105e0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
105f0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
10600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
10610 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
10620 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10630 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
10640 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
10650 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
10660 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
10670 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
10680 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
10690 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41  ist!=0 );.  /* A
106a0 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  ll SELECT result
106b0 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e  s must be column
106c0 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  s. */.  for(i=0;
106d0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
106e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
106f0 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d   *pRes = pEList-
10700 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
10710 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54   if( pRes->op!=T
10720 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
10730 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n 0;.    assert(
10740 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70   pRes->iTable==p
10750 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
10760 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63  r );  /* Not a c
10770 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
10780 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ry */.  }.  retu
10790 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn p;.}.#endif /
107a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
107b0 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
107c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
107d0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
107e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
107f0 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74   checks the left
10800 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
10810 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72  index table iCur
10820 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74   to see if.** it
10830 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
10840 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75  LL entries.  Cau
10850 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  se the register 
10860 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f  at regHasNull to
10870 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20   be set.** to a 
10880 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
10890 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
108a0 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65  no NULLs.  Cause
108b0 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73   register regHas
108c0 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65  Null.** to be se
108d0 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75  t to NULL if iCu
108e0 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  r contains one o
108f0 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
10900 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10910 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73  id sqlite3SetHas
10920 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76  NullFlag(Vdbe *v
10930 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20  , int iCur, int 
10940 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69  regHasNull){.  i
10950 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69  nt addr1;.  sqli
10960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10970 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
10980 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61  regHasNull);.  a
10990 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
109a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
109b0 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64  ewind, iCur); Vd
109c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
109d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109e0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
109f0 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73   iCur, 0, regHas
10a00 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Null);.  sqlite3
10a10 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
10a20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
10a30 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
10a40 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72  ((v, "first_entr
10a50 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29  y_in(%d)", iCur)
10a60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10a70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10a80 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  1);.}.#endif...#
10a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10aa0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
10ab0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
10ac0 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
10ad0 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
10ae0 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
10af0 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
10b00 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
10b10 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
10b20 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
10b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10b40 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
10b50 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
10b60 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
10b70 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
10b80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
10b90 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
10ba0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
10bb0 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
10bc0 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
10bd0 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
10be0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10bf0 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
10c00 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
10c10 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
10c20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
10c30 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
10c40 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
10c50 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
10c60 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
10c70 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
10c80 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
10c90 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
10ca0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
10cb0 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
10cc0 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
10cd0 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
10ce0 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
10cf0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
10d00 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
10d10 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
10d20 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
10d30 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
10d40 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
10d50 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
10d60 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
10d70 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
10d80 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
10d90 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
10da0 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
10db0 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
10dc0 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
10dd0 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
10de0 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
10df0 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
10e00 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
10e10 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
10e20 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
10e30 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
10e40 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
10e50 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
10e60 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
10e70 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
10e80 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
10e90 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
10ea0 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
10eb0 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
10ec0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10ed0 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
10ee0 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
10ef0 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
10f00 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
10f10 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
10f20 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
10f30 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
10f40 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
10f50 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
10f60 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
10f70 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
10f80 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
10f90 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
10fa0 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
10fb0 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
10fe0 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
10ff0 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
11000 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
11010 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
11020 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
11030 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
11040 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11050 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
11060 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
11070 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
11080 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
11090 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
110a0 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
110b0 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
110c0 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
110d0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
110e0 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
110f0 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31   SELECT <column1
11100 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20  >, <column2>... 
11110 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
11120 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
11130 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
11140 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
11150 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
11160 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
11170 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
11180 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
11190 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
111a0 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
111b0 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
111c0 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
111d0 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
111e0 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
111f0 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
11200 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
11210 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
11220 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
11230 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
11240 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
11250 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
11260 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
11270 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
11280 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
11290 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
112a0 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
112b0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
112c0 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
112d0 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
112e0 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
112f0 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
11300 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
11310 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
11320 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
11330 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
11340 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
11350 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
11360 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
11370 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
11380 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
11390 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
113a0 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
113b0 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
113c0 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
113d0 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
113e0 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
113f0 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
11400 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
11410 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
11420 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  lected columns a
11430 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  re guaranteed.**
11440 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
11450 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
11460 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
11470 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64  PRIMARY KEY or d
11480 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55  ue to.** a UNIQU
11490 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
114a0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  index..**.** Whe
114b0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  n IN_INDEX_MEMBE
114c0 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61  RSHIP is used (a
114d0 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
114e0 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
114f0 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
11500 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68  ership tests) th
11510 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  en an epheremal 
11520 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
11530 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
11540 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e  olumns> is a sin
11550 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gle INTEGER PRIM
11560 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
11570 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63  r an .** index c
11580 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  an be found with
11590 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c   the specified <
115a0 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20  columns> as its 
115b0 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a  left-most..**.**
115c0 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58   If the IN_INDEX
115d0 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f  _NOOP_OK and IN_
115e0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
115f0 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e   are both set an
11600 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20  d.** if the RHS 
11610 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
11620 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f  or is a list (no
11630 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68  t a subquery) th
11640 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
11650 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20  ne might decide 
11660 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e  that creating an
11670 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65   ephemeral b-tre
11680 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  e for membership
11690 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74  .** testing is t
116a0 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64  oo expensive and
116b0 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
116c0 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20  _NOOP.  In that 
116d0 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c  case, the.** cal
116e0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f  ling routine sho
116f0 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  uld implement th
11700 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73  e IN operator us
11710 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a  ing a sequence.*
11720 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f  * of Eq or Ne co
11730 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
11740 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ons..**.** When 
11750 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
11760 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
11770 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
11780 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
11790 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65  ion.** might nee
117a0 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  d to know whethe
117b0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53  r or not the RHS
117c0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
117d0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74  operator.** cont
117e0 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66  ains a NULL.  If
117f0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73   prRhsHasNull is
11800 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   not a NULL poin
11810 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74  ter and .** if t
11820 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e  here is any chan
11830 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
11840 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  ) might contain 
11850 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a  a NULL value at.
11860 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  ** runtime, then
11870 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
11880 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
11890 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
118a0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a   written.** to *
118b0 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66  prRhsHasNull. If
118c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
118d0 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
118e0 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
118f0 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
11900 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  n *prRhsHasNull 
11910 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
11920 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  d..**.** If a re
11930 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
11940 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61  ted and its loca
11950 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a  tion stored in *
11960 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68  prRhsHasNull, th
11970 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  en.** the value 
11980 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
11990 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
119a0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
119b0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
119c0 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  .** NULL values,
119d0 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20   and it will be 
119e0 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  some non-NULL va
119f0 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65  lue if the b-tre
11a00 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a  e contains no.**
11a10 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
11a20 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70  .** If the aiMap
11a30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
11a40 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20  t NULL, it must 
11a50 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
11a60 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  y containing.** 
11a70 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20  one element for 
11a80 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  each column retu
11a90 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
11aa0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
11ab0 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68  the RHS.** of th
11ac0 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  e IN(...) operat
11ad0 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74  or. The i'th ent
11ae0 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ry of the array 
11af0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11b00 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20  h the.** offset 
11b10 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
11b20 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  umn that matches
11b30 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
11b40 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11b50 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20  .** SELECT. For 
11b60 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
11b70 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
11b80 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72  elected index ar
11b90 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c  e:.**.**   (?,?,
11ba0 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c  ?) IN (SELECT a,
11bb0 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a   b, c FROM t1).*
11bc0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
11bd0 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20   i1 ON t1(b, c, 
11be0 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61  a);.**.** then a
11bf0 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61  iMap[] is popula
11c00 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20  ted with {2, 0, 
11c10 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  1}..*/.#ifndef S
11c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11c30 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
11c40 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61  indInIndex(.  Pa
11c50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11c60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
11c70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11c80 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20   Expr *pX,      
11c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11ca0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
11cb0 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20  de (RHS) of the 
11cc0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
11cd0 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11cf0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
11d00 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
11d10 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
11d20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
11d30 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
11d40 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
11d50 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
11d60 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
11d70 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20  *aiMap          
11d80 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
11d90 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
11da0 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
11db0 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
11dc0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65  /* SELECT to the
11df0 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65   right of IN ope
11e00 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65  rator */.  int e
11e10 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Type = 0;       
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20   /* Type of RHS 
11e40 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f  table. IN_INDEX_
11e50 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  * */.  int iTab 
11e60 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11e80 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48  Cursor of the RH
11e90 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  S table */.  int
11ea0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20   mustBeUnique;  
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48     /* True if RH
11ed0 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  S must be unique
11ee0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
11ef0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11f00 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56  Parse);     /* V
11f10 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
11f20 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20  eing coded */.. 
11f30 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
11f40 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74  =TK_IN );.  must
11f50 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c  BeUnique = (inFl
11f60 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
11f70 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49  OOP)!=0;..  /* I
11f80 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69  f the RHS of thi
11f90 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
11fa0 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20  or is a SELECT, 
11fb0 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72  and if it matter
11fc0 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  s .  ** whether 
11fd0 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43  or not the SELEC
11fe0 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  T result contain
11ff0 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63  s NULL values, c
12000 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a  heck whether.  *
12010 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73  * or not NULL is
12020 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
12030 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62  le (it may not b
12040 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  e, for example, 
12050 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54  due .  ** to NOT
12060 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
12070 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29  s in the schema)
12080 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  . If no NULL val
12090 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ues are possible
120a0 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73  ,.  ** set prRhs
120b0 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66  HasNull to 0 bef
120c0 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  ore continuing. 
120d0 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48   */.  if( prRhsH
120e0 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66  asNull && (pX->f
120f0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
12100 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ect) ){.    int 
12110 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  i;.    ExprList 
12120 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e  *pEList = pX->x.
12130 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
12140 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12150 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
12160 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
12170 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
12180 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ull(pEList->a[i]
12190 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b  .pExpr) ) break;
121a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
121b0 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ==pEList->nExpr 
121c0 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61  ){.      prRhsHa
121d0 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  sNull = 0;.    }
121e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
121f0 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
12200 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
12210 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
12220 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
12230 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
12240 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
12250 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
12260 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
12270 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  eral table.  */.
12280 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12290 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73  rr==0 && (p = is
122a0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
122b0 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20  t(pX))!=0 ){.   
122c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
122d0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
122e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
122f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12300 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
12310 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12330 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
12340 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20  /.    i16 iDb;  
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12370 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72  Database idx for
12380 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70   pTab */.    Exp
12390 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
123a0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  p->pEList;.    i
123b0 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73  nt nExpr = pELis
123c0 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61  t->nExpr;..    a
123d0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
123e0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
123f0 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
12400 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
12410 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
12420 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
12430 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
12440 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
12450 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
12460 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
12470 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
12480 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
12490 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
124a0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
124b0 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
124c0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
124d0 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f  [0].pTab;..    /
124e0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61  * Code an OP_Tra
124f0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f  nsaction and OP_
12500 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
12510 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
12520 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12530 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
12540 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
12550 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
12560 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
12570 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
12580 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
12590 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
125a0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
125b0 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  ame);..    asser
125c0 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65  t(v);  /* sqlite
125d0 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61  3GetVdbe() has a
125e0 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69  lways been previ
125f0 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a  ously called */.
12600 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
12610 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
12620 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  .pExpr->iColumn<
12630 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
12640 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
12650 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65  rowid FROM table
12660 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  )" case */.     
12670 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
12680 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
12690 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20  , OP_Once);.    
126a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
126b0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
126c0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
126d0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
126e0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
126f0 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
12700 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
12710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12720 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
12730 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
12740 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
12750 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
12760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12770 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
12780 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
12790 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
127a0 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
127b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
127c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
127d0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
127e0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
127f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
12800 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
12810 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
12820 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
12830 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
12840 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
12850 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
12860 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
12870 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12880 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
12890 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
128a0 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
128b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
128c0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
128d0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
128e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
128f0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12900 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12910 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12920 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
12930 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12940 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12950 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
12960 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
12970 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
12980 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
12990 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
129a0 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
129b0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
129c0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
129d0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
129e0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
129f0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
12a00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12a10 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
12a20 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
12a30 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
12a40 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
12a50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
12a60 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
12a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12a80 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
12a90 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
12aa0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
12ab0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
12ac0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
12ad0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
12ae0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
12af0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
12b00 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
12b10 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
12b20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
12b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
12b40 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
12b50 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
12b60 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
12b70 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
12b80 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
12b90 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
12ba0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
12bb0 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
12bc0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
12bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
12be0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
12bf0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
12c00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12c10 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
12c20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
12c30 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
12c40 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
12c50 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
12c60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
12c70 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
12c80 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
12c90 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
12ca0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
12cb0 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
12cc0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
12cd0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
12ce0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
12cf0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
12d00 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
12d10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
12d20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
12d30 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
12d40 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
12d50 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
12d60 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
12d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
12d80 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
12d90 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
12da0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
12db0 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
12dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12dd0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43     /* Maximum nC
12de0 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20  olumn is BMS-2, 
12df0 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68  not BMS-1, so th
12e00 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74  at we can comput
12e10 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42  e.          ** B
12e20 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69  ITMASK(nExpr) wi
12e30 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e  thout overflowin
12e40 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  g */.          t
12e50 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
12e60 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b  Column==BMS-2 );
12e70 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
12e80 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ase( pIdx->nColu
12e90 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  mn==BMS-1 );.   
12ea0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12eb0 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20  >nColumn>=BMS-1 
12ec0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12ed0 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65        if( mustBe
12ee0 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20  Unique ){.      
12ef0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12f00 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20  nKeyCol>nExpr.  
12f10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49             ||(pI
12f20 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70  dx->nColumn>nExp
12f30 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e  r && !IsUniqueIn
12f40 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20  dex(pIdx)).     
12f50 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
12f60 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
12f70 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78  ;  /* This index
12f80 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f   is not unique o
12f90 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63  ver the IN RHS c
12fa0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
12fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12fc0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
12fd0 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20   colUsed = 0;   
12fe0 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e  /* Columns of in
12ff0 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20  dex used so far 
13000 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
13010 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
13020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13030 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
13040 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
13050 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
13060 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
13070 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20     Expr *pRhs = 
13080 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
13090 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
130a0 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
130b0 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
130c0 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
130d0 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b  se, pLhs, pRhs);
130e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
130f0 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20   j;.  .         
13100 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21     assert( pReq!
13110 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c  =0 || pRhs->iCol
13120 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  umn==XN_ROWID ||
13130 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
13140 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
13150 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a  (j=0; j<nExpr; j
13160 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13170 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
13180 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e  olumn[j]!=pRhs->
13190 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
131a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
131b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
131c0 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
131d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
131e0 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65  Req!=0 && sqlite
131f0 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a  3StrICmp(pReq->z
13200 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
13210 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20  ll[j])!=0 ){.   
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
13230 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
13240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13270 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78        if( j==nEx
13280 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
13290 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d          mCol = M
132a0 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20  ASKBIT(j);.     
132b0 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20         if( mCol 
132c0 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61  & colUsed ) brea
132d0 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d  k; /* Each colum
132e0 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  n used only once
132f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
13300 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b  colUsed |= mCol;
13310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13320 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69   aiMap ) aiMap[i
13330 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  ] = j;.         
13340 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
13350 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72  assert( i==nExpr
13360 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41   || colUsed!=(MA
13370 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20  SKBIT(nExpr)-1) 
13380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13390 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42   colUsed==(MASKB
133a0 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a  IT(nExpr)-1) ){.
133b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
133c0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
133d0 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
133e0 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  s the index pIdx
133f0 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20   is usable */.  
13400 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
13410 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13420 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
13430 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
13440 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  e(v);.#ifndef SQ
13450 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
13460 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  N.            sq
13470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13480 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30  v, OP_Explain, 0
13490 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
134a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
134b0 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20  intf(db, "USING 
134c0 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
134d0 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
134e0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
134f0 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43        P4_DYNAMIC
13500 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
13510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13520 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
13530 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
13540 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
13550 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13560 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
13570 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
13580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
13590 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
135a0 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
135b0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
135c0 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
135d0 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
135e0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
135f0 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
13600 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
13610 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
13620 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
13630 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  [0];.  .        
13640 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73      if( prRhsHas
13650 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  Null ){.#ifdef S
13660 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
13670 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
13680 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
13690 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
136a0 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
136b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136c0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
136d0 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20  olumnsUsed, .   
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
136f0 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29  Tab, 0, 0, (u8*)
13700 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29  &mask, P4_INT64)
13710 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
13720 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
13730 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13740 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
13750 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d       if( nExpr==
13760 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
13770 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
13780 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
13790 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  ab, *prRhsHasNul
137a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
137b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
137c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
137d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
137e0 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
137f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13800 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f   } /* End loop o
13810 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ver indexes */. 
13820 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66       } /* End if
13830 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20  ( affinity_ok ) 
13840 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  */.    } /* End 
13850 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20  if not an rowid 
13860 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20  index */.  } /* 
13870 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  End attempt to o
13880 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e  ptimize using an
13890 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20   index */..  /* 
138a0 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e  If no preexistin
138b0 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c  g index is avail
138c0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20  able for the IN 
138d0 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20  clause.  ** and 
138e0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
138f0 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c   an allowed repl
13900 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
13910 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
13920 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c  rator is a list,
13930 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a   not a subquery.
13940 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
13950 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
13960 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
13970 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
13980 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
13990 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
139a0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
139b0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
139c0 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
139d0 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
139e0 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
139f0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
13a00 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
13a10 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
13a20 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
13a30 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
13a40 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
13a50 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
13a60 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
13a70 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
13a80 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
13a90 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13aa0 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  EX_NOOP;.  }..  
13ab0 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
13ac0 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
13ad0 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
13ae0 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
13af0 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
13b00 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
13b10 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
13b20 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
13b30 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
13b40 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
13b50 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
13b60 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
13b70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
13b80 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
13b90 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
13ba0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13bb0 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e  _EPH;.    if( in
13bc0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13bd0 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70  _LOOP ){.      p
13be0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
13bf0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
13c00 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
13c10 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
13c20 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
13c30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
13c40 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
13c50 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
13c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13c70 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
13c80 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68  l ){.      *prRh
13c90 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48  sHasNull = rMayH
13ca0 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
13cb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a  se->nMem;.    }.
13cc0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
13cd0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
13ce0 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
13cf0 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
13d00 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
13d10 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
13d20 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
13d30 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
13d40 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
13d50 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Tab;.  }..  if( 
13d60 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d  aiMap && eType!=
13d70 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
13d80 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  SC && eType!=IN_
13d90 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
13da0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   ){.    int i, n
13db0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
13dc0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
13dd0 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
13de0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
13df0 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b  +) aiMap[i] = i;
13e00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
13e10 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ype;.}.#endif..#
13e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13e30 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
13e40 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72  * Argument pExpr
13e50 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29   is an (?, ?...)
13e60 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
13e70 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ion. This .** fu
13e80 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
13e90 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e   and returns a n
13ea0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
13eb0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
13ec0 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69  .** the affiniti
13ed0 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  es to be used fo
13ee0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
13ef0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
13f00 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
13f10 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
13f20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
13f30 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
13f40 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72   returned.** str
13f50 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ing is eventuall
13f60 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  y freed using sq
13f70 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
13f80 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
13f90 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61  xprINAffinity(Pa
13fa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
13fb0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
13fc0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
13fd0 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e  ->pLeft;.  int n
13fe0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
13ff0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
14000 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  t);.  Select *pS
14010 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e  elect = (pExpr->
14020 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
14030 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78  lect) ? pExpr->x
14040 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20  .pSelect : 0;.  
14050 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61  char *zRet;..  a
14060 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
14070 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65  ==TK_IN );.  zRe
14080 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
14090 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
140a0 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69  db, nVal+1);.  i
140b0 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
140c0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
140d0 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
140e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20  .      Expr *pA 
140f0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
14100 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
14110 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
14120 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
14130 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
14140 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
14150 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
14160 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
14170 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
14180 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
14190 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
141a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
141b0 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
141c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
141d0 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
141e0 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
141f0 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
14200 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14210 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
14220 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
14230 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
14240 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
14250 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
14260 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
14270 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
14280 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
14290 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
142a0 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
142b0 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
142c0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
142d0 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
142e0 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
142f0 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
14300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
14310 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
14320 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
14330 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
14340 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
14350 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
14360 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
14370 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
14380 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
14390 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f  pExpr is a vecto
143a0 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
143b0 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78  used in a contex
143c0 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73  t where.** it is
143d0 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
143e0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  If pExpr is a su
143f0 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c  b-select vector,
14400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a   this routine .*
14410 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73  * loads the Pars
14420 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20  e object with a 
14430 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
14440 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
14450 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
14460 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
14470 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f  ected 1".**.** O
14480 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  r, if it is a re
14490 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63  gular scalar vec
144a0 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f  tor:.**.**   "ro
144b0 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
144c0 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
144d0 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
144e0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
144f0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23   Expr *pExpr){.#
14500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14510 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
14520 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
14530 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
14540 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73  .    sqlite3Subs
14550 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
14560 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
14570 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
14580 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  pr, 1);.  }else.
14590 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
145a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
145b0 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
145c0 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d  e misused");.  }
145d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
145e0 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
145f0 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
14600 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
14610 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
14620 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
14630 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
14640 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
14650 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
14660 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
14670 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
14680 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
14690 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
146a0 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
146b0 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
146c0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
146d0 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
146e0 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
146f0 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
14700 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
14710 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
14720 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
14730 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
14740 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
14750 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
14760 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
14770 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
14780 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
14790 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
147a0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
147b0 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
147c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
147d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
147e0 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
147f0 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
14800 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
14810 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
14820 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
14830 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
14840 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
14850 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
14860 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
14870 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
14880 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
14890 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
148a0 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
148b0 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
148c0 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
148d0 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
148e0 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
148f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
14900 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
14910 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
14920 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
14930 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
14940 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
14950 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
14960 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
14970 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
14980 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
14990 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
149a0 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
149b0 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
149c0 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
149d0 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
149e0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
149f0 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
14a00 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
14a10 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
14a20 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
14a30 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
14a40 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
14a50 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
14a60 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
14a70 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
14a80 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
14a90 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
14aa0 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
14ab0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
14ac0 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
14ad0 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
14ae0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
14af0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
14b00 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
14b10 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
14b20 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
14b30 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72  n.  Return 0 for
14b40 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
14b50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
14b60 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  urs..*/.#ifndef 
14b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14b80 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
14b90 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
14ba0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
14bc0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14bd0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
14be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14bf0 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
14c00 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
14c10 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
14c20 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
14c30 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
14c40 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
14c50 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
14c60 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c80 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
14c90 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
14ca0 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
14cb0 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
14cc0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
14cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
14ce0 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
14cf0 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
14d00 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
14d30 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
14d40 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
14d50 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14d60 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
14d70 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
14d80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
14d90 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
14da0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  e);..  /* The ev
14db0 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
14dc0 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54  IN/EXISTS/SELECT
14dd0 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
14de0 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
14df0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
14e00 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
14e10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
14e20 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
14e30 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
14e40 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
14e50 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
14e60 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
14e70 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
14e80 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
14e90 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
14ea0 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
14eb0 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
14ec0 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
14ed0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
14ee0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
14ef0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
14f00 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
14f10 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
14f20 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
14f30 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
14f40 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
14f50 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
14f60 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
14f70 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
14f80 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
14f90 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
14fa0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
14fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14fc0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
14fd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14fe0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14ff0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
15000 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
15010 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
15020 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
15030 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
15040 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
15050 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
15060 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49  d",.        jmpI
15070 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
15080 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
15090 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
150a0 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
150b0 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20  CALAR",.        
150c0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
150d0 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
150e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
150f0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
15100 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
15110 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
15120 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
15130 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
15140 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
15150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
15160 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
15170 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
15180 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
15190 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
151a0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
151b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
151c0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
151d0 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
151e0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
151f0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
15200 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
15210 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
15220 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
15230 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20      int nVal;   
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
15260 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20  r pLeft */.     
15270 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73   .      nVal = s
15280 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
15290 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  Size(pLeft);.   
152a0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
152b0 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29  wid || nVal==1 )
152c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
152d0 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
152e0 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
152f0 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
15300 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
15310 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
15320 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
15330 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
15340 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
15350 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
15360 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79  d with index key
15370 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
15380 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
15390 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45  the .      ** SE
153a0 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
153b0 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
153c0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
153d0 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
153e0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
153f0 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
15400 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
15410 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
15420 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
15430 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
15440 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
15450 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
15460 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
15470 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
15480 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
15490 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
154a0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
154b0 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
154c0 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
154d0 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
154e0 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
154f0 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
15500 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
15510 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
15520 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
15530 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
15540 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
15550 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
15560 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
15570 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
15580 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
15590 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
155a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
155b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
155c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
155d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
155e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
155f0 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f  Table, (isRowid?
15600 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20  0:nVal));.      
15610 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
15620 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
15630 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
15640 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
15650 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
15660 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15670 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
15680 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
15690 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
156a0 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
156b0 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
156c0 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
156d0 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
156e0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
156f0 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
15700 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
15710 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
15720 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
15730 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
15740 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
15750 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
15760 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
15770 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
15780 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
15790 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
157a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
157b0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
157c0 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
157d0 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
157e0 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
157f0 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
15800 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69       ** error wi
15810 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
15820 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
15830 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
15840 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
15850 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
15860 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20  t->nExpr==nVal) 
15870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
15880 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
15890 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
158a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
158b0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
158c0 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
158d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
158e0 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41           dest.zA
158f0 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41  ffSdst = exprINA
15900 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
15910 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
15920 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
15930 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
15940 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
15950 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ble );.         
15960 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
15970 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15980 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
15990 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
159a0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
159b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
159c0 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
159d0 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
159e0 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
159f0 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
15a00 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
15a10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
15a20 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15a40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
15a50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
15a60 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
15a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
15a80 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
15a90 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fo);.           
15aa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
15ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15ac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
15ad0 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
15ae0 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
15af0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
15b00 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
15b10 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
15b20 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
15b30 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
15b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
15b50 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  List!=0 );.     
15b60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
15b70 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
15b80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15b90 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
15ba0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
15bb0 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
15bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
15bd0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
15be0 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
15bf0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15c00 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
15c10 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
15c20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
15c30 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [i] = sqlite3Bin
15c40 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
15c50 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q(.             
15c60 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45     pParse, p, pE
15c70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
15c90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15cb0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
15cc0 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
15cd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
15ce0 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
15cf0 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
15d00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
15d10 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
15d20 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
15d30 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
15d40 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
15d50 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
15d60 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
15d70 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
15d80 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
15d90 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
15da0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
15db0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
15dc0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
15dd0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
15de0 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
15df0 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
15e00 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
15e10 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
15e20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
15e30 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
15e40 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
15e50 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
15e60 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   IN */.        i
15e70 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
15e80 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
15e90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15ea0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
15eb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
15ec0 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
15ed0 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
15ee0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
15ef0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
15f00 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20  nity(pLeft);.   
15f10 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
15f20 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
15f30 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
15f40 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
15f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
15f60 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
15f70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15f80 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
15f90 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
15fa0 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
15fb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
15fc0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
15fd0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
15fe0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
15ff0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16000 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
16010 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
16020 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
16030 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
16040 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16050 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
16060 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16070 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16080 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
16090 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74   isRowid ) sqlit
160a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
160b0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
160c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
160d0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
160e0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
160f0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
16100 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
16110 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
16120 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
16130 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
16140 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
16150 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16160 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
16170 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
16180 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
16190 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
161a0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
161b0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
161c0 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
161d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
161e0 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
161f0 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
16200 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
16210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
16220 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
16230 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
16240 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
16250 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
16260 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
16270 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
16280 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
16290 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
162a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
162b0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
162c0 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
162d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
162e0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
162f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
16300 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
16310 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
16320 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
16330 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
16340 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
16350 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
16360 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
16370 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
16380 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
16390 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
163a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
163b0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
163c0 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
163d0 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
163e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
163f0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
16400 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
16410 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
16420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16430 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
16440 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16460 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
16470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
164a0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
164c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
164e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
164f0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
16500 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
16510 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
16520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16540 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
16550 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
16560 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
16570 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
16580 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16590 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
165a0 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
165b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
165c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
165d0 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
165e0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
165f0 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a  le, r2, r3, 1);.
16600 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16620 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
16630 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16640 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
16650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
16660 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16670 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
16680 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
16690 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
166a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
166b0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
166c0 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
166d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
166e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
166f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
16700 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
16710 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
16720 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
16730 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
16740 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46     (SELECT ... F
16750 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
16760 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49  *     or:    EXI
16770 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  STS(SELECT ... F
16780 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
16790 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
167a0 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
167b0 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
167c0 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
167d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
167e0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
167f0 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
16800 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
16810 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
16820 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ex of.      ** t
16830 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
16840 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
16850 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
16860 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
16870 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
16880 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
16890 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a  (exists).      *
168a0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
168b0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
168c0 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
168d0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
168e0 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73    ** In both cas
168f0 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73  es, the query is
16900 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
16910 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20  "LIMIT 1".  Any 
16920 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69  .      ** preexi
16930 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
16940 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
16950 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
16960 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  IT 1..      */. 
16970 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
16980 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
16990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
169a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
169b0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
169c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
169d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
169e0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
169f0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
16a00 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  CT result */.   
16a10 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
16a40 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
16a50 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  e */..      test
16a60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
16a70 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
16a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
16a90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
16aa0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
16ab0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
16ac0 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
16ad0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
16ae0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16af0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16b00 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16b10 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
16b20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
16b30 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
16b40 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70  nReg = pExpr->op
16b50 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53  ==TK_SELECT ? pS
16b60 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
16b70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  r : 1;.      sql
16b80 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
16b90 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61  it(&dest, 0, pPa
16ba0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
16bb0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
16bc0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20   += nReg;.      
16bd0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
16be0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
16bf0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
16c00 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
16c10 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64    dest.iSdst = d
16c20 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
16c30 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20       dest.nSdst 
16c40 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20  = nReg;.        
16c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c60 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
16c70 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
16c80 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
16c90 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
16ca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
16cb0 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
16cc0 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
16cd0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
16ce0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
16cf0 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
16d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16d10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
16d20 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
16d30 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
16d40 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
16d50 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
16d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
16d70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
16d80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
16d90 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
16da0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
16db0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
16dc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
16dd0 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20  INTEGER,.       
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
16e00 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
16e10 20 30 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d   0);.      pSel-
16e20 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
16e30 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
16e40 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61  s &= ~SF_MultiVa
16e50 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  lue;.      if( s
16e60 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16e70 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
16e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
16e90 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
16ea0 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
16eb0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
16ec0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
16ed0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
16ee0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72  educe);.      br
16ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16f00 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c    if( rHasNullFl
16f10 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
16f20 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
16f30 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  v, pExpr->iTable
16f40 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b  , rHasNullFlag);
16f50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49  .  }..  if( jmpI
16f60 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20  fDynamic>=0 ){. 
16f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16f80 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44  mpHere(v, jmpIfD
16f90 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73  ynamic);.  }.  s
16fa0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
16fb0 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  op(pParse);..  r
16fc0 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
16fd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16fe0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
16ff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17000 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
17010 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20  .** Expr pIn is 
17020 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  an IN(...) expre
17030 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ssion. This func
17040 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74  tion checks that
17050 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c   the .** sub-sel
17060 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ect on the RHS o
17070 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61  f the IN() opera
17080 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65  tor has the same
17090 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63   number of .** c
170a0 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65  olumns as the ve
170b0 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
170c0 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20   Or, if the RHS 
170d0 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e  of the IN() is n
170e0 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65  ot .** a sub-que
170f0 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53  ry, that the LHS
17100 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20   is a vector of 
17110 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  size 1..*/.int s
17120 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49  qlite3ExprCheckI
17130 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  N(Parse *pParse,
17140 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69   Expr *pIn){.  i
17150 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  nt nVector = sql
17160 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
17170 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  ze(pIn->pLeft);.
17180 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67    if( (pIn->flag
17190 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
171a0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65  ) ){.    if( nVe
171b0 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65  ctor!=pIn->x.pSe
171c0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
171d0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
171e0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
171f0 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  or(pParse, pIn->
17200 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
17210 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f  t->nExpr, nVecto
17220 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
17230 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
17240 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31  e if( nVector!=1
17250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
17260 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50  ectorErrorMsg(pP
17270 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74  arse, pIn->pLeft
17280 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
17290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
172a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
172b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
172c0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
172d0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
172e0 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
172f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
17300 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
17310 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
17320 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
17330 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
17340 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
17350 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65  s a scalar or ve
17360 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ctor expression.
17370 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d    The .** right-
17380 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
17390 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
173a0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c  ero or more scal
173b0 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a  ar values, or a.
173c0 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66  ** subquery.  If
173d0 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75   the RHS is a su
173e0 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62  bquery, the numb
173f0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
17400 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74  umns must.** mat
17410 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
17420 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
17430 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
17440 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  S.  If the RHS i
17450 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76  s.** a list of v
17460 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d  alues, the LHS m
17470 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e  ust be a scalar.
17480 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f   .**.** The IN o
17490 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20  perator is true 
174a0 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  if the LHS value
174b0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
174c0 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  thin the RHS..**
174d0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   The result is f
174e0 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
174f0 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f  is definitely no
17500 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  t in the RHS.  T
17510 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  he .** result is
17520 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65   NULL if the pre
17530 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53  sence of the LHS
17540 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e   in the RHS cann
17550 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d  ot be .** determ
17560 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c  ined due to NULL
17570 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
17580 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
17590 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
175a0 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
175b0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
175c0 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
175d0 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
175e0 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
175f0 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
17600 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
17610 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
17620 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
17630 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
17640 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
17650 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
17660 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
17670 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
17680 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73  .**.** See the s
17690 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61  eparate in-opera
176a0 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61  tor.md documenta
176b0 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65  tion file in the
176c0 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51   canonical.** SQ
176d0 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65  Lite source tree
176e0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
176f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
17700 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
17710 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
17720 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17730 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17740 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
17750 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
17760 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17780 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
17790 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
177a0 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
177b0 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
177c0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
177d0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
177e0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
177f0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
17800 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
17810 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
17820 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
17830 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
17840 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
17850 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
17860 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
17870 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
17880 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
17890 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
178a0 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
178b0 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20  nt rLhs;        
178c0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
178d0 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  (s) holding the 
178e0 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  LHS values */.  
178f0 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20  int rLhsOrig;   
17900 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c        /* LHS val
17910 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f  ues prior to reo
17920 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70  rdering by aiMap
17930 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  [] */.  Vdbe *v;
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17950 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
17960 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
17970 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
17980 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
17990 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
179a0 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
179b0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
179c0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
179d0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
179e0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
179f0 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
17a00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
17a10 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
17a20 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
17a30 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d  or */.  int iDum
17a40 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  my;           /*
17a50 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72   Dummy parameter
17a60 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74   to exprCodeVect
17a70 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a  or() */.  Expr *
17a80 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
17a90 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
17aa0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
17ab0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
17ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
17ad0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
17ae0 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20  t destStep2;    
17af0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
17b00 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20  jump when NULLs 
17b10 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a  seen in step 2 *
17b20 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
17b30 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61  6 = 0;    /* Sta
17b40 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53  rt of code for S
17b50 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
17b60 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20  ddrTruthOp;     
17b70 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f   /* Address of o
17b80 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72  pcode that deter
17b90 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20  mines the IN is 
17ba0 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  true */.  int de
17bb0 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20  stNotNull;      
17bc0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17bd0 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  a comparison is 
17be0 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70  not true in step
17bf0 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
17c00 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Top;          /*
17c10 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70   Top of the step
17c20 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70  -6 loop */ ..  p
17c30 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
17c40 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  eft;.  if( sqlit
17c50 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
17c60 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
17c70 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
17c80 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
17c90 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
17ca0 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
17cb0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
17cc0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
17cd0 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29    aiMap = (int*)
17ce0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
17cf0 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73  ero(.      pPars
17d00 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28  e->db, nVector*(
17d10 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69  sizeof(int) + si
17d20 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a  zeof(char)) + 1.
17d30 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73    );.  if( pPars
17d40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17d50 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74  led ) goto sqlit
17d60 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d  e3ExprCodeIN_oom
17d70 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74  _error;..  /* At
17d80 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65  tempt to compute
17d90 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20   the RHS. After 
17da0 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e  this step, if an
17db0 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
17dc0 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  n.  ** IN_INDEX_
17dd0 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
17de0 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e  , the table open
17df0 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45  ed ith cursor pE
17e00 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a  xpr->iTable .  *
17e10 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  * contains the v
17e20 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
17e30 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49  up the RHS. If I
17e40 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
17e50 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74  returned,.  ** t
17e60 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79  he RHS has not y
17e70 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20  et been coded.  
17e80 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
17e90 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
17ea0 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
17eb0 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
17ec0 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
17ed0 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
17ee0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
17ef0 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
17f00 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
17f10 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
17f20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
17f50 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
17f60 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
17f70 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
17fa0 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
17fb0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61  RhsHasNull, aiMa
17fc0 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  p);..  assert( p
17fd0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e  Parse->nErr || n
17fe0 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79  Vector==1 || eTy
17ff0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48  pe==IN_INDEX_EPH
18000 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
18010 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
18020 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49  _ASC || eType==I
18030 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
18040 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20  SC .  );.#ifdef 
18050 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
18060 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61  * Confirm that a
18070 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  iMap[] contains 
18080 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20  nVector integer 
18090 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30  values between 0
180a0 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f   and.  ** nVecto
180b0 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  r-1. */.  for(i=
180c0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
180d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63  +){.    int j, c
180e0 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d  nt;.    for(cnt=
180f0 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20  j=0; j<nVector; 
18100 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a  j++) if( aiMap[j
18110 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  ]==i ) cnt++;.  
18120 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31    assert( cnt==1
18130 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
18140 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48    /* Code the LH
18150 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  S, the <expr> fr
18160 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
18170 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53  ..)". If the LHS
18180 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74   is a .  ** vect
18190 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73  or, then it is s
181a0 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
181b0 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67  y of nVector reg
181c0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
181d0 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a  .  ** at r1..  *
181e0 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69  *.  ** sqlite3Fi
181f0 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68  ndInIndex() migh
18200 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64  t have reordered
18210 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74   the fields of t
18220 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20  he LHS vector.  
18230 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  ** so that the f
18240 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65  ields are in the
18250 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61   same order as a
18260 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
18270 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d  .   The.  ** aiM
18280 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ap[] array conta
18290 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72  ins a mapping fr
182a0 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
182b0 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20  LHS field order 
182c0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c  to.  ** the fiel
182d0 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74  d order that mat
182e0 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64  ches the RHS ind
182f0 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
18300 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
18310 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f  pParse);.  rLhsO
18320 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65  rig = exprCodeVe
18330 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ctor(pParse, pLe
18340 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20  ft, &iDummy);.  
18350 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18360 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d  or && aiMap[i]==
18370 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65  i; i++){} /* Are
18380 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72   LHS fields reor
18390 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20  dered? */.  if( 
183a0 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20  i==nVector ){.  
183b0 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20    /* LHS fields 
183c0 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65  are not reordere
183d0 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20  d */.    rLhs = 
183e0 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73  rLhsOrig;.  }els
183f0 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  e{.    /* Need t
18400 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48  o reorder the LH
18410 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69  S fields accordi
18420 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20  ng to aiMap */. 
18430 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65     rLhs = sqlite
18440 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
18450 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  arse, nVector);.
18460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18470 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
18480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18490 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
184a0 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c  , rLhsOrig+i, rL
184b0 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b  hs+aiMap[i], 0);
184c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
184d0 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
184e0 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
184f0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
18500 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
18510 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
18520 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
18530 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
18540 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
18550 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
18560 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
18570 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
18580 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e  s is step (1) in
18590 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72   the in-operator
185a0 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c  .md optimized al
185b0 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20  gorithm..  */.  
185c0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
185d0 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_NOOP ){.    
185e0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
185f0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18600 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
18610 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
18620 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
18630 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
18640 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b  .    int labelOk
18650 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18660 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18670 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65  int r2, regToFre
18680 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b  e;.    int regCk
18690 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Null = 0;.    in
186a0 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74  t ii;.    assert
186b0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
186c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
186d0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
186e0 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  f( destIfNull!=d
186f0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
18700 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20      regCkNull = 
18710 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18720 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
18730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18740 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
18750 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67   rLhs, rLhs, reg
18760 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  CkNull);.    }. 
18770 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
18780 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
18790 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  ++){.      r2 = 
187a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
187b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73  emp(pParse, pLis
187c0 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  t->a[ii].pExpr, 
187d0 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20  &regToFree);.   
187e0 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
187f0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
18800 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e  anBeNull(pList->
18810 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
18820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18830 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18840 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c  BitAnd, regCkNul
18850 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c  l, r2, regCkNull
18860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18870 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e   if( ii<pList->n
18880 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66  Expr-1 || destIf
18890 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
188a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
188b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
188c0 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c  , OP_Eq, rLhs, l
188d0 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20  abelOk, r2,.    
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
18900 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
18910 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
18920 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c  erageIf(v, ii<pL
18930 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
18940 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18950 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69  ageIf(v, ii==pLi
18960 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
18970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18980 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
18990 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  f[0]);.      }el
189a0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
189b0 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  rt( destIfNull==
189c0 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20  destIfFalse );. 
189d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
189e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
189f0 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46  e, rLhs, destIfF
18a00 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20  alse, r2,.      
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
18a30 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56  , P4_COLLSEQ); V
18a40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a  dbeChangeP5(v, z
18a70 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f  Aff[0] | SQLITE_
18a80 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
18a90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18aa0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18ab0 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72  (pParse, regToFr
18ac0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
18ad0 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a  f( regCkNull ){.
18ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18af0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
18b00 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  Null, regCkNull,
18b10 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
18b20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18b30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18b40 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
18b50 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lse);.    }.    
18b60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18b70 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
18b80 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ok);.    sqlite3
18b90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18ba0 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c  Parse, regCkNull
18bb0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69  );.    goto sqli
18bc0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
18bd0 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f  nished;.  }..  /
18be0 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20  * Step 2: Check 
18bf0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
18c00 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  S contains any N
18c10 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66  ULL columns.  If
18c20 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f   the.  ** LHS do
18c30 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73  es contain NULLs
18c40 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
18c50 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
18c60 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20  FALSE or NULL.. 
18c70 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e   ** We will then
18c80 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79   skip the binary
18c90 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52   search of the R
18ca0 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
18cb0 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
18cc0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65  fFalse ){.    de
18cd0 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66  stStep2 = destIf
18ce0 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  False;.  }else{.
18cf0 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
18d00 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69  destStep6 = sqli
18d10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18d20 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
18d30 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
18d40 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
18d50 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
18d60 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78  FieldSubexpr(pEx
18d70 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pr->pLeft, i);. 
18d80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
18d90 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29  prCanBeNull(p) )
18da0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18dc0 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20  IsNull, rLhs+i, 
18dd0 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20  destStep2);.    
18de0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18e00 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20  /* Step 3.  The 
18e10 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e  LHS is now known
18e20 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e   to be non-NULL.
18e30 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20    Do the binary 
18e40 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74  search.  ** of t
18e50 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65  he RHS using the
18e60 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e   LHS as a probe.
18e70 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20    If found, the 
18e80 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74  result is.  ** t
18e90 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rue..  */.  if( 
18ea0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
18eb0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
18ec0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
18ed0 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
18ee0 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
18ef0 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73  ee and so we als
18f00 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68  o.    ** know th
18f10 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  at the RHS is no
18f20 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  n-NULL.  Hence, 
18f30 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  we combine steps
18f40 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20   3 and 4.    ** 
18f50 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
18f60 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  code. */.    sql
18f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18f80 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
18f90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
18fa0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73  estIfFalse, rLhs
18fb0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
18fc0 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
18fd0 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65  TruthOp = sqlite
18fe0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
18ff0 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74  P_Goto);  /* Ret
19000 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65  urn True */.  }e
19010 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19020 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19030 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c  _Affinity, rLhs,
19040 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66   nVector, 0, zAf
19050 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  f, nVector);.   
19060 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
19070 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a  ==destIfNull ){.
19080 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
19090 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70   Step 3 and Step
190a0 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65   5 into a single
190b0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
190c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190d0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
190e0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
190f0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
19100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
19120 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
19130 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19140 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
19150 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
19160 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  hed;.    }.    /
19170 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20  * Ordinary Step 
19180 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  3, for the case 
19190 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20  where FALSE and 
191a0 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63  NULL are distinc
191b0 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75  t */.    addrTru
191c0 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
191d0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
191e0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
191f0 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20  iTable, 0,.     
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
19230 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
19250 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20   4.  If the RHS 
19260 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  is known to be n
19270 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64  on-NULL and we d
19280 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a  id not find.  **
19290 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65   an match on the
192a0 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74   search above, t
192b0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
192c0 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20  ust be FALSE..  
192d0 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73  */.  if( rRhsHas
192e0 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d  Null && nVector=
192f0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
19300 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19310 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48  P_NotNull, rRhsH
19320 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61  asNull, destIfFa
19330 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  lse);.    VdbeCo
19340 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
19350 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66    /* Step 5.  If
19360 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
19370 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72  about the differ
19380 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c  ence between NUL
19390 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45  L and.  ** FALSE
193a0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
193b0 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a  rn false. .  */.
193c0 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
193d0 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20  e==destIfNull ) 
193e0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
193f0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
19400 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c  ..  /* Step 6: L
19410 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73  oop through rows
19420 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f   of the RHS.  Co
19430 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74  mpare each row t
19440 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20  o the LHS..  ** 
19450 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f  If any compariso
19460 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
19470 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
19480 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a  LL.  If all.  **
19490 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65   comparisons are
194a0 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20   FALSE then the 
194b0 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20  final result is 
194c0 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  FALSE..  **.  **
194d0 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48   For a scalar LH
194e0 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69  S, it is suffici
194f0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73  ent to check jus
19500 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a  t the first row.
19510 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e    ** of the RHS.
19520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
19530 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56  Step6 ) sqlite3V
19540 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19550 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20  v, destStep6);. 
19560 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
19570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19580 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
19590 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
195a0 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
195b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
195c0 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
195d0 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
195e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
195f0 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65  abel(v);.  }else
19600 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65  {.    /* For nVe
19610 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65  ctor==1, combine
19620 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62   steps 6 and 7 b
19630 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  y immediately re
19640 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46  turning.    ** F
19650 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73  ALSE if the firs
19660 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  t comparison is 
19670 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  not NULL */.    
19680 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65  destNotNull = de
19690 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20  stIfFalse;.  }. 
196a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
196b0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
196c0 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c  xpr *p;.    Coll
196d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
196e0 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33  int r3 = sqlite3
196f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19700 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  e);.    p = sqli
19710 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
19720 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
19730 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
19740 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
19750 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
19760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19770 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
19780 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69  pExpr->iTable, i
19790 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r3);.    sqlit
197a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
197b0 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64  OP_Ne, rLhs+i, d
197c0 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a  estNotNull, r3,.
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
197f0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
19800 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19810 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19820 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19830 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d  pParse, r3);.  }
19840 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19850 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19860 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b   0, destIfNull);
19870 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  .  if( nVector>1
19880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19890 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
198a0 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b  v, destNotNull);
198b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
198c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
198d0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
198e0 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20  , addrTop+1);.  
198f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19900 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20  );..    /* Step 
19910 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20  7:  If we reach 
19920 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
19930 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73  now that the res
19940 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ult must.    ** 
19950 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20  be false. */.   
19960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19970 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19980 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19990 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20    }..  /* Jumps 
199a0 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
199b0 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f   return true. */
199c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
199d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72  mpHere(v, addrTr
199e0 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33  uthOp);..sqlite3
199f0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
19a00 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21  hed:.  if( rLhs!
19a10 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69  =rLhsOrig ) sqli
19a20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19a30 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b  g(pParse, rLhs);
19a40 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
19a50 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
19a60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19a70 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
19a80 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  );.sqlite3ExprCo
19a90 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a  deIN_oom_error:.
19aa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19ab0 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
19ac0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
19ad0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
19ae0 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zAff);.}.#endif 
19af0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
19b00 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
19b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19b20 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
19b30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
19b40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
19b50 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
19b60 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
19b70 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
19b80 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
19b90 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
19ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
19bb0 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
19bc0 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
19bd0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
19be0 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
19bf0 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
19c00 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
19c10 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
19c20 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
19c30 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
19c40 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
19c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19c60 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
19c70 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
19c80 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
19c90 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
19ca0 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
19cb0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
19cc0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
19cd0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
19ce0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19cf0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
19d00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
19d10 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
19d20 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
19d30 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
19d40 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
19d50 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
19d60 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
19d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19d80 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
19d90 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
19da0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
19db0 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
19dc0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
19dd0 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
19de0 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
19df0 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
19e00 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
19e10 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
19e20 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
19e30 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
19e40 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
19e50 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
19e60 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
19e70 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
19e80 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
19e90 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
19ea0 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
19eb0 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
19ec0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
19ed0 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
19ee0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
19ef0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
19f00 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
19f10 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
19f20 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
19f30 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
19f40 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
19f50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19f60 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
19f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19f80 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
19f90 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
19fa0 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
19fb0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
19fc0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
19fd0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
19fe0 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
19ff0 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63  alue);.    if( c
1a000 3d 3d 31 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==1 || (c==2 && 
1a010 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65  !negFlag) || (ne
1a020 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d  gFlag && value==
1a030 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29  SMALLEST_INT64))
1a040 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1a050 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1a060 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
1a070 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a080 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
1a090 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
1a0a0 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
1a0b0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
1a0c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
1a0d0 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
1a0e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1a0f0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
1a100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1a110 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a120 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
1a130 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73  al too big: %s%s
1a140 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22  ", negFlag?"-":"
1a150 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
1a160 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
1a170 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1a180 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
1a190 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
1a1a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1a1b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
1a1c0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
1a1d0 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
1a1e0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
1a1f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a200 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1a210 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
1a220 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1a230 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1a240 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a250 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61   Erase column-ca
1a260 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  che entry number
1a270 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   i.*/.static voi
1a280 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
1a290 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1a2a0 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
1a2b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a2c0 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20  [i].tempReg ){. 
1a2d0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1a2e0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1a2f0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1a300 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
1a310 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1a320 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1a330 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1a340 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1a350 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1a360 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  e->nColCache--;.
1a370 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e    if( i<pParse->
1a380 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  nColCache ){.   
1a390 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1a3a0 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
1a3b0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1a3c0 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
1a3d0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
1a3e0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
1a3f0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
1a400 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
1a410 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
1a420 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
1a430 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
1a440 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
1a450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1a460 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
1a470 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1a480 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
1a490 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1a4a0 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
1a4b0 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
1a4c0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1a4d0 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
1a4e0 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
1a4f0 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
1a500 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
1a510 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
1a520 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
1a530 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
1a540 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
1a550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
1a570 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
1a580 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
1a590 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
1a5a0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
1a5b0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1a5c0 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
1a5d0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a5e0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
1a5f0 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
1a600 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
1a610 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
1a620 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
1a630 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
1a640 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
1a650 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
1a670 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1a680 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1a690 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1a6a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
1a6b0 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
1a6c0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
1a6d0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
1a6e0 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
1a6f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a700 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
1a710 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
1a720 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
1a730 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
1a740 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
1a750 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
1a760 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
1a770 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
1a780 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
1a790 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1a7a0 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1a7b0 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1a7c0 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
1a7d0 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  t( p->iTable!=iT
1a7e0 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
1a7f0 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
1a800 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1a810 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65 61  e cache is alrea
1a820 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20  dy full, delete 
1a830 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e 74  the least recent
1a840 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a 2f  ly used entry */
1a850 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1a860 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54 45  ColCache>=SQLITE
1a870 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20  _N_COLCACHE ){. 
1a880 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66     minLru = 0x7f
1a890 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78 4c  ffffff;.    idxL
1a8a0 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  ru = -1;.    for
1a8b0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1a8c0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1a8d0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1a8e0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
1a8f0 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
1a900 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64  ru ){.        id
1a910 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
1a920 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
1a930 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  u;.      }.    }
1a940 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
1a950 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
1a960 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ru];.  }else{.  
1a970 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1a980 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d  ColCache[pParse-
1a990 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20  >nColCache++];. 
1a9a0 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
1a9b0 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
1a9c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
1a9d0 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65  he */.  p->iLeve
1a9e0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
1a9f0 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54  heLevel;.  p->iT
1aa00 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 70  able = iTab;.  p
1aa10 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
1aa20 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52  ;.  p->iReg = iR
1aa30 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67  eg;.  p->tempReg
1aa40 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d   = 0;.  p->lru =
1aa50 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1aa60 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  nt++;.}../*.** I
1aa70 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
1aa80 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
1aa90 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
1aaa0 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
1aab0 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
1aac0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
1aad0 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
1aae0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1aaf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1ab00 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
1ab10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ab20 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1ab30 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1ab40 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1ab50 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1ab60 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1ab70 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73 65  che *p = &pParse
1ab80 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a  ->aColCache[i];.
1ab90 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
1aba0 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
1abb0 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
1abc0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1abd0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1abe0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1abf0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
1ac00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
1ac10 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
1ac20 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
1ac30 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
1ac40 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
1ac50 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
1ac60 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
1ac70 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
1ac80 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
1ac90 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
1aca0 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
1acb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1acc0 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
1acd0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
1ace0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1acf0 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
1ad00 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1ad10 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1ad20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1ad30 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1ad40 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25  rintf("PUSH to %
1ad50 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1ad60 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1ad70 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1ad80 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
1ad90 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
1ada0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
1adb0 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
1adc0 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
1add0 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  us sqlite3ExprCa
1ade0 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f  chePush operatio
1adf0 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
1ae00 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74  ds, restore.** t
1ae10 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20  he cache to the 
1ae20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1ae30 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  prior the most r
1ae40 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76  ecent Push..*/.v
1ae50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ae60 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
1ae70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 20  Parse){.  int i 
1ae80 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1ae90 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1aea0 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73  el>=1 );.  pPars
1aeb0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d  e->iCacheLevel--
1aec0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1aed0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1aee0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1aef0 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1af00 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1af10 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c  ntf("POP  to %d\
1af20 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
1af30 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
1af40 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69 3c  ndif.  while( i<
1af50 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1af60 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1af70 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1af80 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ].iLevel>pParse-
1af90 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
1afa0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
1afb0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29  Clear(pParse, i)
1afc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1afd0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     i++;.    }.  
1afe0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
1aff0 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
1b000 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
1b010 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
1b020 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
1b030 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
1b040 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
1b050 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
1b060 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
1b070 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
1b080 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1b090 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1b0a0 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
1b0b0 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
1b0c0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
1b0d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b0e0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
1b0f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b100 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1b110 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1b120 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1b130 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1b140 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1b150 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1b160 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1b170 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1b180 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
1b190 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
1b1a0 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
1b1b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b1c0 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1b1d0 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1b1e0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1b1f0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1b200 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1b210 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1b220 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b230 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1b240 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1b250 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1b260 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1b270 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1b280 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1b290 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1b2a0 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1b2b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1b2c0 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1b2d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1b2e0 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1b2f0 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1b300 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1b310 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1b320 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1b330 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1b340 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1b350 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1b360 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1b370 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1b380 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1b390 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1b3a0 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1b3b0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1b3c0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1b3d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b3e0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1b3f0 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1b400 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1b410 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a  fTab = iTabCur;.
1b420 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b430 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1b440 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1b450 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1b460 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1b470 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1b480 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1b490 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1b4a0 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1b4b0 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1b4f0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1b500 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b510 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1b520 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1b530 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1b540 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1b550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b560 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1b570 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1b580 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1b590 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1b5a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1b5b0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1b5c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1b5d0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1b5e0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1b5f0 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1b600 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1b610 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1b620 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1b630 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1b640 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1b650 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1b660 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1b670 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1b680 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1b690 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1b6a0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1b6b0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1b6c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b6d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b6e0 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1b6f0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1b700 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1b710 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1b720 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1b730 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1b740 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1b750 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1b760 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1b770 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1b780 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1b790 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1b7a0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1b7b0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1b7c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1b7d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1b7e0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1b7f0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1b800 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1b810 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1b820 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1b830 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1b840 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b850 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1b860 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1b870 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1b880 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1b890 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1b8a0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1b8b0 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1b8c0 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1b8d0 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1b8e0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1b8f0 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1b900 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1b910 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1b920 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1b930 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1b940 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1b950 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1b960 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1b970 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1b980 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1b990 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1b9a0 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1b9b0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1b9c0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1b9d0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1b9e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1b9f0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1ba00 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1ba10 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1ba20 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1ba30 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1ba40 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1ba50 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1ba60 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ba70 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1ba80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1ba90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1baa0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1bab0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1bac0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1bad0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1bae0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1baf0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1bb00 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1bb10 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1bb20 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1bb30 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1bb40 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1bb50 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1bb60 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1bb70 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1bb80 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1bb90 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1bba0 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1bbb0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1bbc0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1bbd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1bbe0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1bbf0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
1bc00 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bc10 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
1bc20 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
1bc30 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
1bc40 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
1bc50 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
1bc60 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
1bc70 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
1bc80 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
1bc90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bca0 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
1bcb0 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
1bcc0 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
1bcd0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
1bce0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1bcf0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1bd00 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1bd10 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
1bd20 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1bd30 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
1bd40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bd50 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
1bd60 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
1bd70 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bd80 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1bd90 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
1bda0 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
1bdb0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64  urn iReg;.}.void
1bdc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bdd0 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a  GetColumnToReg(.
1bde0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1bdf0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1be00 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1be10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
1be20 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
1be30 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1be40 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
1be50 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
1be60 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1be70 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
1be80 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
1be90 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
1bea0 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
1beb0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
1bec0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
1bed0 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
1bee0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
1bef0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
1bf00 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
1bf10 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1bf20 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
1bf30 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65   iColumn, iTable
1bf40 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66  , iReg, 0);.  if
1bf50 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c  ( r1!=iReg ) sql
1bf60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1bf70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1bf80 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67  _SCopy, r1, iReg
1bf90 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
1bfa0 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
1bfb0 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
1bfc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bfd0 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
1bfe0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
1bff0 20 69 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   i;..#if SQLITE_
1c000 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1c010 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1c020 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1c030 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1c040 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a  ntf("CLEAR\n");.
1c050 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
1c060 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1c070 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
1c080 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1c090 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
1c0a0 6d 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50  mpReg.     && pP
1c0b0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1c0c0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1c0d0 3e 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29  >aTempReg).    )
1c0e0 7b 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  {.       pParse-
1c0f0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1c100 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1c110 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1c120 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d  e[i].iReg;.    }
1c130 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1c140 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a  ColCache = 0;.}.
1c150 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
1c160 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
1c170 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
1c180 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
1c190 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
1c1a0 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
1c1b0 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
1c1c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c1d0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1c1e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c1f0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1c200 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
1c210 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1c220 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
1c230 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
1c240 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c250 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1c260 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1c270 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1c280 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1c290 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1c2a0 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
1c2b0 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
1c2c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c2d0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1c2e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c2f0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1c300 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1c310 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1c320 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1c330 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1c340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c350 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1c360 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1c370 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
1c380 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1c390 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
1c3a0 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
1c3b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c3c0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1c3d0 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
1c3e0 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
1c3f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
1c400 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
1c410 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
1c420 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
1c430 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
1c440 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
1c450 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
1c460 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1c470 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
1c480 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
1c490 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
1c4a0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
1c4b0 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
1c4c0 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1c4d0 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
1c4e0 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
1c4f0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1c500 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
1c510 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1c520 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1c530 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1c540 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1c550 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1c560 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1c570 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
1c580 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
1c590 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
1c5a0 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
1c5b0 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
1c5c0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1c5d0 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
1c5e0 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
1c5f0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
1c600 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c  * Convert a scal
1c610 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ar expression no
1c620 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
1c630 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a  TER referencing.
1c640 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ** register iReg
1c650 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  .  The caller mu
1c660 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  st ensure that i
1c670 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  Reg already cont
1c680 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
1c690 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1c6a0 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
1c6b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1c6c0 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1c6d0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1c6e0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1c6f0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1c700 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1c710 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1c720 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1c730 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1c740 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  ./*.** Evaluate 
1c750 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  an expression (e
1c760 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
1c770 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
1c780 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65  ssion) and store
1c790 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
1c7a0 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65  n continguous te
1c7b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c7c0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  s.  Return the i
1c7d0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ndex of.** the f
1c7e0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73  irst register us
1c7f0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1c800 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
1c810 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1c820 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1c830 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61   a temporary sca
1c840 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77  lar, then also w
1c850 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67  rite.** that reg
1c860 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74  ister number int
1c870 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20  o *piFreeable.  
1c880 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1c890 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a  result register.
1c8a0 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  ** is not a temp
1c8b0 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20  orary or if the 
1c8c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1c8d0 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72  vector set *piFr
1c8e0 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a  eeable.** to 0..
1c8f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1c900 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72  prCodeVector(Par
1c910 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c920 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65   *p, int *piFree
1c930 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  able){.  int iRe
1c940 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73  sult;.  int nRes
1c950 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1c960 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a  rVectorSize(p);.
1c970 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31    if( nResult==1
1c980 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20   ){.    iResult 
1c990 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c9a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c  eTemp(pParse, p,
1c9b0 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20   piFreeable);.  
1c9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72  }else{.    *piFr
1c9d0 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  eeable = 0;.    
1c9e0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  if( p->op==TK_SE
1c9f0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 52  LECT ){.      iR
1ca00 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1ca10 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1ca20 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20  rse, p, 0, 0);. 
1ca30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65  int i;.      iRe
1ca50 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
1ca60 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
1ca70 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1ca80 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  sult;.      for(
1ca90 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=0; i<nResult; 
1caa0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
1cab0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
1cac0 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20  torable(pParse, 
1cad0 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1cae0 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c  .pExpr, i+iResul
1caf0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1cb00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
1cb10 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Result;.}.../*.*
1cb20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cb30 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1cb40 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
1cb50 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
1cb60 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
1cb70 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
1cb80 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1cb90 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
1cba0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
1cbb0 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
1cbc0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
1cbd0 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
1cbe0 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
1cbf0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
1cc00 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
1cc10 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
1cc20 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1cc30 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
1cc40 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
1cc50 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
1cc60 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
1cc70 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
1cc80 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1cc90 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
1cca0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1ccb0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
1ccc0 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
1ccd0 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
1cce0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ccf0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
1cd00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1cd10 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1cd20 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1cd30 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cd40 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
1cd50 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1cd60 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
1cd90 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1cda0 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
1cdb0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
1cdc0 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
1cdd0 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
1cde0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1cdf0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1ce00 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1ce10 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1ce20 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1ce30 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
1ce40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1ce50 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1ce60 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1ce70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
1ce80 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
1ce90 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
1cea0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
1ceb0 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ced0 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
1cee0 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  sion node */.  i
1cef0 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73  nt p5 = 0;..  as
1cf00 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1cf10 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1cf20 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1cf30 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
1cf40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1cf50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1cf60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cf70 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
1cf80 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1cf90 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1cfa0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1cfb0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1cfc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1cfd0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1cfe0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1cff0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1d000 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1d010 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1d020 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1d030 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1d040 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1d050 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1d060 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1d070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d080 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1d090 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1d0a0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1d0b0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1d0c0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1d0d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1d0e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d0f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1d100 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1d110 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1d140 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1d150 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1d160 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1d170 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1d180 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1d190 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1d1a0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1d1b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d1c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1d1d0 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1d1e0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1d1f0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1d200 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
1d210 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
1d220 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1d230 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1d240 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1d250 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1d260 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1d270 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1d280 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
1d290 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
1d2a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d2b0 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1d2c0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1d2d0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1d2e0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1d2f0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1d300 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1d310 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1d320 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1d330 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1d340 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1d350 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1d360 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
1d370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1d380 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1d390 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1d3a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1d3b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1d3e0 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d410 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1d420 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1d430 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1d440 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1d450 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1d460 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1d470 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d480 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d490 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1d4a0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1d4b0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1d4c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d4d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d4e0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d4f0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1d500 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d510 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1d520 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1d530 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1d540 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1d550 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1d560 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d570 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d580 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d590 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1d5a0 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1d5b0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1d5c0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1d5d0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1d5e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1d5f0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d600 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d610 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1d620 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d630 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1d640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d650 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1d660 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1d670 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1d680 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d690 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1d6a0 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1d6b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d6c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d6d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d6e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d6f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1d700 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1d710 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1d720 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d730 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d740 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1d750 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1d760 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1d770 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d780 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1d790 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1d7a0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d7b0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1d7c0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1d7d0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1d7e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d7f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1d800 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1d810 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1d820 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1d830 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1d840 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d850 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1d860 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d870 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d880 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1d890 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1d8a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d8b0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1d8c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d8d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1d8e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d8f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d900 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1d910 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1d920 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1d930 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1d940 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1d950 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1d960 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
1d970 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
1d980 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f  List, pExpr->iCo
1d990 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  lumn);.        a
1d9a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d9b0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c  zToken[0]=='?' |
1d9c0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1d9d0 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20  u.zToken, z)==0 
1d9e0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
1d9f0 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30  e->pVList[0] = 0
1da00 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c  ; /* Indicate VL
1da10 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65  ist may no longe
1da20 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  r be enlarged */
1da30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1da40 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
1da50 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41  (char*)z, P4_STA
1da60 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1da70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1da80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1da90 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1daa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
1dab0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1dac0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1dad0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1dae0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1daf0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1db00 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1db10 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1db20 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1db30 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1db40 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1db50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1db60 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1db70 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1db80 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1db90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dba0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1dbb0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1dbc0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1dbd0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1dbe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1dbf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1dc00 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1dc30 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1dc40 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1dc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1dc60 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1dc70 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1dc80 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1dc90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1dca0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1dcb0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1dcc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  ;.      return i
1dcd0 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  nReg;.    }.#end
1dce0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1dcf0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1dd00 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1dd10 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
1dd20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1dd30 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1dd40 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20  _NE;.      p5 = 
1dd50 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1dd60 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72       /* fall-thr
1dd70 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
1dd80 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1dd90 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1dda0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ddb0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1ddc0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1ddd0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1dde0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1ddf0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1de00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1de10 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29  rIsVector(pLeft)
1de20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1de30 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50  VectorCompare(pP
1de40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1de50 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20  get, op, p5);.  
1de60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1de70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1de80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1de90 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1dea0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1deb0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dec0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ded0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dee0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1def0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1df00 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45  Parse, pLeft, pE
1df10 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1df20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
1df30 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
1df40 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29  TE_STOREP2 | p5)
1df50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1df60 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1df70 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1df80 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1df90 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1dfa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1dfb0 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1dfc0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1dfd0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1dfe0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1dff0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e000 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1e010 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e020 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1e030 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1e040 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e050 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1e060 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e070 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1e080 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1e090 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0a0 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1e0b0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e0c0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1e0d0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1e0e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0f0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1e100 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e110 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1e120 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1e130 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e140 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e150 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1e160 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e170 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1e180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e190 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
1e1a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
1e1b0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1e1c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1e1d0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
1e1e0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
1e1f0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
1e200 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
1e210 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
1e220 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1e230 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
1e240 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
1e250 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
1e260 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
1e270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e280 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
1e290 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e2a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
1e2b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e2c0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
1e2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
1e2e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e2f0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1e300 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
1e310 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
1e320 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e330 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
1e340 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
1e350 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
1e360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e370 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
1e380 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e390 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
1e3a0 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
1e3b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
1e3c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e3d0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
1e3e0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
1e3f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1e400 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
1e410 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
1e420 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
1e430 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e440 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
1e450 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
1e460 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
1e470 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
1e480 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
1e490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e4a0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
1e4b0 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
1e4c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
1e4d0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1e4e0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
1e4f0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
1e500 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1e510 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
1e520 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
1e530 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
1e540 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e550 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
1e560 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e570 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e580 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e590 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e5a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1e5b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e5c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e5d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1e5e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1e5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e600 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1e610 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1e620 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e630 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e640 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e650 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e670 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1e680 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1e690 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1e6a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1e6b0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1e6c0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1e6d0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1e6e0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1e6f0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1e700 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e710 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e730 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e740 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1e750 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1e760 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1e770 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e780 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e790 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e7a0 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1e7b0 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1e7c0 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1e7d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e7e0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1e7f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e800 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1e810 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1e820 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1e830 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1e840 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1e850 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1e860 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1e870 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e880 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e890 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1e8a0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1e8b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e8c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e8d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e8e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1e8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e900 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1e910 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1e920 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1e930 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e940 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1e950 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e960 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1e970 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
1e980 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
1e990 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
1e9a0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
1e9b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e9c0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
1e9d0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
1e9e0 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
1e9f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ea00 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
1ea10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ea20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ea30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ea40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ea50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ea60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ea70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ea80 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1ea90 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1eaa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eab0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1eac0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1ead0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1eae0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1eaf0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1eb00 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1eb10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1eb20 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1eb30 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1eb40 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1eb50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1eb60 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1eb70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eb80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1eb90 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1eba0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ebb0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ebc0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ebd0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ebe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ebf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1ec00 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1ec10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1ec20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1ec30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ec40 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1ec50 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ec60 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1ec70 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1ec80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ec90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1eca0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1ecb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ecc0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1ecd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ece0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1ecf0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1ed00 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1ed10 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1ed20 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1ed30 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1ed40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ed50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ed60 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ed70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1ed80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ed90 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1eda0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1edb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1edc0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1edd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ede0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1edf0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1ee00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1ee10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ee20 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1ee30 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1ee40 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1ee50 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1ee60 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ee70 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1ee80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ee90 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1eea0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1eeb0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1eec0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1eed0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1eee0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1eef0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1ef00 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1ef10 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1ef20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
1ef30 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
1ef40 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ef50 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1ef60 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
1ef70 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
1ef80 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1ef90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1efa0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
1efb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1efc0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
1efd0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1efe0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
1eff0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
1f000 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1f010 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
1f020 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
1f030 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
1f040 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
1f050 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
1f060 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
1f070 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
1f080 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
1f090 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1f0a0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
1f0b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1f0c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
1f0d0 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
1f0e0 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
1f0f0 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
1f100 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
1f110 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
1f120 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
1f130 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
1f140 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
1f150 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1f160 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1f170 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f180 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
1f190 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f1a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f1b0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1f1c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
1f1d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f1e0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1f1f0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1f200 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1f210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1f220 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1f230 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1f240 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
1f250 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
1f260 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
1f270 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f280 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1f290 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1f2a0 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
1f2b0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
1f2c0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1f2d0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
1f2e0 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
1f2f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1f300 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
1f310 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
1f320 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
1f330 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
1f340 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
1f350 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
1f360 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
1f370 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
1f380 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
1f390 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
1f3a0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
1f3b0 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
1f3c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f3d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f3e0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
1f3f0 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
1f400 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f410 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f420 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
1f430 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
1f440 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
1f450 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
1f460 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
1f470 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
1f480 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
1f490 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
1f4a0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
1f4b0 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
1f4c0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
1f4d0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
1f4e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
1f4f0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1f500 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
1f510 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
1f520 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
1f530 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f540 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f550 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
1f560 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
1f570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f580 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
1f590 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1f5a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1f5b0 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
1f5c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1f5d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f5e0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
1f5f0 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
1f600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
1f610 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1f620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f630 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1f640 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
1f650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f660 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f670 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1f680 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f690 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
1f6a0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
1f6b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f6c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f6d0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1f6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f6f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f700 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1f710 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1f720 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f730 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
1f740 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
1f750 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1f760 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
1f770 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
1f780 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
1f790 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
1f7a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
1f7b0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1f7c0 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
1f7d0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
1f7e0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
1f7f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f810 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1f820 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1f830 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f840 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1f850 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
1f860 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
1f870 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
1f880 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
1f890 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
1f8a0 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
1f8b0 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1f8c0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
1f8d0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1f8e0 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
1f8f0 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
1f900 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
1f910 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f920 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f930 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
1f940 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1f950 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
1f960 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
1f970 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
1f980 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
1f990 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
1f9a0 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
1f9b0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1f9c0 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
1f9d0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1f9e0 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
1f9f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1fa00 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1fa10 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1fa20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
1fa50 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
1fa60 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
1fa70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1fa80 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
1fa90 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
1faa0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
1fab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
1fac0 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
1fad0 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
1fae0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
1faf0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1fb00 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
1fb10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
1fb20 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
1fb30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1fb40 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
1fb50 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fb60 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1fb70 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
1fb80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
1fb90 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1fba0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1fbb0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
1fbc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1fbd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1fbe0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
1fbf0 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
1fc00 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
1fc10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1fc20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1fc30 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
1fc40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fc50 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
1fc60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1fc70 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
1fc80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1fc90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
1fca0 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
1fcb0 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
1fcc0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
1fcd0 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
1fce0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
1fcf0 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
1fd00 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
1fd10 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1fd20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
1fd30 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
1fd40 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
1fd50 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
1fd60 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
1fd70 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
1fd80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1fd90 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1fda0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
1fdb0 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
1fdc0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
1fdd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
1fde0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
1fdf0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1fe00 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
1fe10 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
1fe20 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
1fe30 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
1fe40 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
1fe50 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
1fe60 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
1fe70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
1fe80 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
1fe90 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1fea0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
1feb0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
1fec0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1fed0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1fee0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1fef0 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
1ff00 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1ff20 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
1ff30 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
1ff40 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
1ff50 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
1ff60 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
1ff70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ff80 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
1ff90 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
1ffa0 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
1ffb0 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
1ffc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ffd0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
1ffe0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1fff0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
20000 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
20010 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
20020 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
20030 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
20040 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
20070 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
20080 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
20090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
200a0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
200b0 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
200c0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
200d0 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
200e0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
200f0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
20100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
20110 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
20120 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
20130 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
20140 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
20150 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
20160 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
20170 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
20180 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
20190 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
201a0 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
201b0 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
201c0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
201d0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
201e0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
201f0 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
20200 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
20210 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
20220 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
20230 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
20240 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
20250 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
20260 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
20270 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
20280 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
20290 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
202a0 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
202b0 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
202c0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
202d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
202e0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
202f0 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
20300 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
20310 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
20320 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
20330 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
20340 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
20350 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
20360 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
20370 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
20380 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
20390 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
203a0 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
203b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
203c0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
203d0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
203e0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
203f0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
20400 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
20410 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
20420 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
20430 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
20440 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
20450 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
20460 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
20470 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
20480 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
20490 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
204a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
204b0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
204c0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
204d0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
204e0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
204f0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
20500 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
20510 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
20520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20530 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
20540 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
20550 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
20560 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
20570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20580 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
20590 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  ion0, constMask,
205a0 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
205d0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
205e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
205f0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
20600 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
20610 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
20620 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
20630 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
20640 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
20650 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
20660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
20670 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20680 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20690 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
206a0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
206b0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
206c0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
206d0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
206e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
206f0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
20700 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
20710 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
20720 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
20730 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
20740 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
20750 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
20760 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
20770 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
20780 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
20790 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
207a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
207b0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
207c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
207d0 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
207e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
207f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20800 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
20810 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
20820 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
20830 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d  ->pLeft->iTable=
20840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
20850 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
20860 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  le = sqlite3Code
20870 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
20880 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20890 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
208a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
208b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
208c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
208d0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
208e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
208f0 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26  >iTable.       &
20900 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  & pExpr->iTable!
20910 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  =(n = sqlite3Exp
20920 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
20930 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20  r->pLeft)) .    
20940 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20950 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20960 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
20970 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
20980 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
209b0 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ble, n);.      }
209c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
209d0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
209e0 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c  le + pExpr->iCol
209f0 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  umn;.    }.    c
20a00 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
20a10 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
20a20 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
20a30 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20a40 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
20a50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
20a60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20a80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
20a90 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
20aa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20ab0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
20ac0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
20ad0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
20ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20af0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
20b00 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
20b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20b20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20b30 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
20b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
20b60 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
20b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20b80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
20b90 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
20ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
20bb0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
20bc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
20bd0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
20be0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
20bf0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
20c00 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
20c10 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
20c20 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
20c30 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
20c40 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
20c50 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
20c60 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
20c70 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
20c80 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
20c90 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
20ca0 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
20cb0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
20cc0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
20cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20ce0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
20cf0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
20d00 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
20d10 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
20d20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20d30 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
20d40 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
20d50 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
20d60 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
20d70 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
20d80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
20d90 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
20da0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20db0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
20dc0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
20dd0 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
20de0 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
20df0 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
20e00 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
20e10 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
20e20 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
20e30 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
20e40 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
20e50 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
20e60 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
20e70 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
20e80 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
20e90 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
20ea0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
20eb0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
20ec0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
20ed0 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
20ee0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
20ef0 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
20f00 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
20f10 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
20f20 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
20f30 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
20f40 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
20f50 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
20f60 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
20f70 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
20f80 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
20f90 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
20fa0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
20fb0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
20fc0 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
20fd0 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
20fe0 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
20ff0 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
21000 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
21010 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
21020 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
21030 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
21040 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
21050 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
21060 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
21070 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
21080 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
21090 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
210a0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
210b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
210c0 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
210d0 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
210e0 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
210f0 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
21100 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
21110 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
21120 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
21130 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
21140 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
21150 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
21160 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
21170 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
21180 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
21190 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
211a0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
211b0 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
211c0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
211d0 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
211e0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
211f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21200 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
21210 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
21220 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
21230 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
21240 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
21250 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
21260 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
21270 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
21280 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
21290 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
212a0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
212b0 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
212c0 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
212d0 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
212e0 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
212f0 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
21300 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
21310 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
21320 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
21330 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
21340 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
21350 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
21360 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
21370 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
21380 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
21390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
213a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
213b0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
213c0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
213d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
213e0 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
213f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
21400 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
21410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
21420 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
21430 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
21440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
21460 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
21470 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21480 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
21490 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
214a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
214b0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
214c0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
214d0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
214e0 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
214f0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
21500 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
21510 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
21520 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
21530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
21540 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
21550 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
21560 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
21570 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
21580 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
21590 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
215a0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
215b0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
215c0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
215d0 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
215e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
215f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
21600 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
21610 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
21620 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
21630 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
21640 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
21650 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
21660 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
21670 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21680 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
21690 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
216a0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
216b0 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
216c0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
216d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
216e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
216f0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
21700 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
21710 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21720 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
21730 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
21740 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
21750 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21760 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
21770 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
21780 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
21790 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
217a0 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
217b0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
217c0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
217d0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
217e0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
217f0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
21800 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
21810 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
21820 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
21830 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
21840 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
21850 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
21860 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
21870 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
21880 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
21890 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
218a0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
218b0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
218c0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
218d0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
218e0 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
218f0 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
21900 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
21910 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
21920 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
21930 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
21940 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
21950 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
21960 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
21970 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
21980 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
21990 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
219a0 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
219b0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
219c0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
219d0 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
219e0 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
219f0 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
21a00 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
21a10 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
21a20 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
21a30 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
21a40 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
21a50 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
21a60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21a70 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
21a80 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
21a90 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
21aa0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
21ab0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
21ac0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
21ad0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
21ae0 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
21af0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
21b00 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
21b10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
21b20 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
21b30 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
21b40 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
21b50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
21b60 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
21b70 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
21b80 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
21b90 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bb0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
21bc0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
21bd0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
21be0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
21c10 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
21c20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21c50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21c60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
21c70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
21c80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
21c90 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
21ca0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
21cb0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
21cc0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
21cd0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
21ce0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
21cf0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
21d00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
21d10 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
21d20 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
21d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21d50 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
21d60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
21d70 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
21d80 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
21d90 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
21da0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
21db0 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
21dc0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
21dd0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
21de0 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
21df0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
21e00 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
21e10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
21e20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
21e30 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
21e40 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
21e50 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
21e60 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
21e70 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
21e80 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
21e90 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
21ea0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
21eb0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
21ec0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
21ed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21ee0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
21ef0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
21f00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
21f10 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
21f20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
21f30 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
21f40 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
21f50 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
21f60 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
21f70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
21f80 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
21f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
21fa0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
21fb0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
21fc0 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
21fd0 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
21fe0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
21ff0 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
22000 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
22010 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
22020 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
22030 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
22040 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
22050 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
22060 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
22070 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
22080 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
22090 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
220a0 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
220b0 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
220c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
220d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
220e0 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
220f0 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
22100 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
22110 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
22120 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
22130 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
22140 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
22150 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
22170 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
22180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22190 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
221a0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
221b0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
221c0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
221d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
221e0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
221f0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
22200 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
22210 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
22220 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
22230 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
22240 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
22250 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
22260 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
22270 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22280 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
22290 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
222a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
222b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
222c0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
222d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
222e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
222f0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
22300 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
22310 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22320 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22330 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
22340 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
22350 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
22360 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
22370 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
22380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22390 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
223a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
223b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
223c0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
223d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
223e0 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
223f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
22400 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
22410 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
22420 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22430 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
22440 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
22450 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22470 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
22480 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
224a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
224b0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
224c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
224d0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
224e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
224f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
22500 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
22510 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
22520 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
22530 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
22540 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22550 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
22560 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22570 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
22580 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
22590 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
225a0 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
225b0 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
225c0 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
225d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
225e0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
225f0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
22600 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
22610 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
22620 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
22630 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
22640 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
22650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
22660 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
22670 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
22680 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22690 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
226a0 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
226b0 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
226c0 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
226d0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
226e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
226f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22700 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
22710 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
22720 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22730 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
22740 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22750 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
22760 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
22770 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
22780 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
22790 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
227a0 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
227b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
227c0 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
227d0 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
227e0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
227f0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
22800 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
22810 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
22820 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
22840 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
22850 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
22860 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
22870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22890 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
228a0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
228b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
228c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
228d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
228e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
228f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
22900 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
22910 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
22920 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
22930 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
22940 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
22950 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
22960 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
22970 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
22980 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
22990 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65  ..**.** If regDe
229a0 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72  st>=0 then the r
229b0 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
229c0 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72  stored in that r
229d0 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a  egister and the.
229e0 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  ** result is not
229f0 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72   reusable.  If r
22a00 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68  egDest<0 then th
22a10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72  is routine is fr
22a20 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20  ee to .** store 
22a30 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65  the value wheree
22a40 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54  ver it wants.  T
22a50 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
22a60 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
22a70 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
22a80 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65  s returned.  Whe
22a90 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f  n regDest<0, two
22aa0 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65   identical expre
22ab0 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63  ssions will.** c
22ac0 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ode to the same 
22ad0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
22ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22af0 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
22b00 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
22b10 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22b20 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
22b30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
22b40 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
22b50 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
22b60 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
22b70 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20  nt regDest      
22b80 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
22b90 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
22ba0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
22bb0 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65  rList *p;.  asse
22bc0 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  rt( ConstFactorO
22bd0 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70  k(pParse) );.  p
22be0 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
22bf0 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67  tExpr;.  if( reg
22c00 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20  Dest<0 && p ){. 
22c10 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
22c20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
22c30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
22c40 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
22c50 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
22c60 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
22c70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22c80 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
22c90 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
22ca0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
22cb0 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
22cc0 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
22cd0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
22ce0 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
22cf0 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73  .  }.  pExpr = s
22d00 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
22d10 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
22d20 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
22d30 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
22d40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
22d50 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
22d60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
22d70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
22d80 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
22d90 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
22da0 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44  >reusable = regD
22db0 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20  est<0;.     if( 
22dc0 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44  regDest<0 ) regD
22dd0 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  est = ++pParse->
22de0 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d  nMem;.     pItem
22df0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
22e00 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d  g = regDest;.  }
22e10 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
22e20 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74  tExpr = p;.  ret
22e30 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a  urn regDest;.}..
22e40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
22e50 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
22e60 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
22e70 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
22e80 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
22e90 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
22ea0 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
22eb0 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
22ec0 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
22ed0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22ee0 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
22ef0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
22f00 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
22f10 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
22f20 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
22f30 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
22f40 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
22f50 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
22f60 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
22f70 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
22f80 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
22f90 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
22fa0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
22fb0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65  routine might ge
22fc0 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63  nerate this.** c
22fd0 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ode to fill the 
22fe0 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
22ff0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
23000 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ection of the.**
23010 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69   VDBE program, i
23020 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f  n order to facto
23030 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  r it out of the 
23040 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e  evaluation loop.
23050 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
23060 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
23070 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
23080 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
23090 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20  g){.  int r2;.  
230a0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
230b0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
230c0 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e  Expr);.  if( Con
230d0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
230e0 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  e).   && pExpr->
230f0 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a  op!=TK_REGISTER.
23100 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
23110 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
23120 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20  in(pExpr).  ){. 
23130 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
23140 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23150 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
23160 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
23170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23180 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
23190 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
231a0 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
231b0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
231c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
231d0 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
231e0 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
231f0 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
23200 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
23210 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23220 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
23230 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
23240 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23250 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
23260 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
23270 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
23280 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
23290 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
232a0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
232b0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
232c0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
232d0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
232e0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
232f0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
23300 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
23310 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
23320 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
23330 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
23340 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
23350 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
23360 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
23370 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
23380 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
23390 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
233a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
233b0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
233c0 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
233d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
233e0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
233f0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
23400 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
23410 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
23420 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
23430 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
23440 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  dbe!=0 || pParse
23450 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23460 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
23470 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
23480 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
23490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
234a0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
234b0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
234c0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
234d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
234e0 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73  .** Make a trans
234f0 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70  ient copy of exp
23500 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
23510 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75  d then code it u
23520 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45  sing.** sqlite3E
23530 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73  xprCode().  This
23540 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a   routine works j
23550 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  ust like sqlite3
23560 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78  ExprCode().** ex
23570 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e  cept that the in
23580 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
23590 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
235a0 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  be unchanged..*/
235b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
235c0 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
235d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
235e0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
235f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23600 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23610 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23620 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
23630 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  r, 0);.  if( !db
23640 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23660 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23670 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74  target);.  sqlit
23680 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
23690 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
236a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
236b0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
236c0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
236d0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
236e0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
236f0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
23700 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
23710 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
23720 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
23730 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
23740 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
23750 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
23760 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
23770 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
23780 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
23790 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
237a0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
237b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
237c0 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
237d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
237e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
237f0 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
23800 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
23810 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
23820 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
23830 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
23840 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
23850 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
23860 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
23870 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
23880 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23890 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
238a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
238b0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
238c0 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
238d0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
238e0 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
238f0 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
23900 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
23910 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
23920 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
23930 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
23940 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
23950 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
23960 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
23970 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
23980 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
23990 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
239a0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
239b0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
239c0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
239d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
239e0 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
239f0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
23a00 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
23a10 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
23a20 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
23a30 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
23a40 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
23a50 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
23a60 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
23a70 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
23a80 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
23a90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
23aa0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
23ab0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
23ac0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
23ad0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
23ae0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
23af0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
23b00 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
23b10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23b20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
23b30 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
23b40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23b50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
23b60 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
23b70 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
23b80 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
23b90 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
23ba0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23bb0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
23bc0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
23bd0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
23be0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
23bf0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
23c00 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
23c10 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
23c20 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
23c30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23c40 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
23c50 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
23c60 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
23c70 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
23c80 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
23c90 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
23ca0 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
23cb0 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
23cc0 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
23cd0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
23ce0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
23cf0 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
23d00 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
23d10 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
23d20 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
23d30 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
23d40 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
23d50 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
23d60 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
23d70 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
23d80 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
23d90 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
23da0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
23db0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
23dc0 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
23dd0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
23de0 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
23df0 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
23e00 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
23e10 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
23e20 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23e30 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
23e40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23e50 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23e60 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
23e70 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
23e80 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
23e90 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
23ea0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
23eb0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
23ec0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
23ed0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
23ee0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
23ef0 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
23f00 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
23f10 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
23f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
23f30 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
23f40 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
23f50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23f60 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
23f70 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
23f80 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
23f90 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
23fa0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
23fb0 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
23fc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
23fd0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
23fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
23ff0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
24000 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
24010 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
24020 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
24030 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
24040 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
24050 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
24060 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
24070 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
24080 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
24090 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
240a0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
240b0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
240c0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
240d0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
240e0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
240f0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
24100 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d  0 && (j = pItem-
24110 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
24120 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  )>0 ){.      if(
24130 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
24140 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a  ECEL_OMITREF ){.
24150 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
24160 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
24170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24190 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72  (v, copyOp, j+sr
241a0 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69  cReg-1, target+i
241b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
241c0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
241d0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
241e0 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
241f0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24200 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
24210 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24220 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
24230 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
24240 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24250 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
24260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24270 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24280 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
24290 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
242a0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
242b0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
242c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70  .        if( cop
242d0 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  yOp==OP_Copy.   
242e0 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71        && (pOp=sq
242f0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
24300 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  , -1))->opcode==
24310 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
24320 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
24330 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20  >p3+1==inReg.   
24340 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
24350 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67  +pOp->p3+1==targ
24360 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  et+i.        ){.
24370 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
24380 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  3++;.        }el
24390 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
243a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
243b0 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67  v, copyOp, inReg
243c0 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
243d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
243e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
243f0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
24400 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24410 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
24420 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
24430 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
24440 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
24450 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
24460 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
24470 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
24480 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
24490 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
244a0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
244b0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69  xpression.** eli
244c0 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  mination of x..*
244d0 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66  *.** The xJumpIf
244e0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
244f0 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a  mines details:.*
24500 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20  *.**    NULL:   
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61  Store the boolea
24530 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b  n result in reg[
24540 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69  dest].**    sqli
24550 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20  te3ExprIfTrue:  
24560 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
24570 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73   if true.**    s
24580 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24590 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64  e:     Jump to d
245a0 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a  est if false.**.
245b0 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c  ** The jumpIfNul
245c0 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  l parameter is i
245d0 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49  gnored if xJumpI
245e0 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  f is NULL..*/.st
245f0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
24600 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
24610 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
24620 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
24630 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
24640 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
24650 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
24660 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
24670 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
24680 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
24690 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
246a0 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63  n or storage loc
246b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
246c0 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c  (*xJump)(Parse*,
246d0 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20  Expr*,int,int), 
246e0 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b  /* Action to tak
246f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
24700 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
24710 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
24720 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
24730 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70   */.){. Expr exp
24740 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
24750 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
24760 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
24770 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
24780 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
24790 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
247a0 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
247b0 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
247c0 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
247d0 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
247e0 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
247f0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
24800 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
24810 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
24820 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d  ister */...  mem
24830 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30  set(&compLeft, 0
24840 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
24850 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52  .  memset(&compR
24860 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ight, 0, sizeof(
24870 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
24880 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69  (&exprAnd, 0, si
24890 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
248a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
248b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
248c0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
248d0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
248e0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
248f0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
24900 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
24910 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
24920 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
24930 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
24940 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
24950 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
24960 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
24970 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
24980 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
24990 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
249a0 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
249b0 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
249c0 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
249d0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
249e0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
249f0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
24a00 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
24a10 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70  ster(&exprX, exp
24a20 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
24a30 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
24a40 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78  Free1));.  if( x
24a50 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d  Jump ){.    xJum
24a60 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  p(pParse, &exprA
24a70 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
24a80 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
24a90 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
24aa0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65  expression is be
24ab0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ing from the ON 
24ac0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
24ad0 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a  of a join.    **
24ae0 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c   so that the sql
24af0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
24b00 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  et() routine wil
24b10 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
24b20 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20   move.    ** it 
24b30 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70  into the Parse.p
24b40 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20  ConstExpr list. 
24b50 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61   We should use a
24b60 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69   new bit for thi
24b70 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c  s,.    ** for cl
24b80 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72  arity, but we ar
24b90 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e  e out of bits in
24ba0 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20   the Expr.flags 
24bb0 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20  field so we.    
24bc0 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65  ** have to reuse
24bd0 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
24be0 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a   bit.  Bummer. *
24bf0 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67  /.    exprX.flag
24c00 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  s |= EP_FromJoin
24c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
24c20 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
24c30 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
24c40 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
24c50 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24c60 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
24c70 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
24c80 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
24c90 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
24ca0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24cb0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
24cc0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
24cd0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
24ce0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24cf0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24d00 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
24d10 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
24d20 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
24d30 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24d40 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24d50 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
24d60 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
24d70 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24d80 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24d90 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
24da0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
24db0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24dc0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24dd0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
24de0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
24df0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
24e00 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
24e10 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24e20 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
24e30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
24e40 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24e50 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24e60 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24e70 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
24e80 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
24e90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
24ea0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24eb0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
24ec0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
24ed0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
24ee0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
24ef0 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Jump==0 );.}../*
24f00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24f10 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
24f20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
24f30 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
24f40 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
24f50 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
24f60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24f70 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
24f80 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
24f90 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
24fa0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24fb0 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
24fc0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
24fd0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
24fe0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
24ff0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
25000 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
25010 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
25020 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
25030 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
25040 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
25050 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
25060 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
25070 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
25080 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
25090 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
250a0 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
250b0 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
250c0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
250d0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
250e0 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
250f0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
25100 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
25110 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
25120 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
25130 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
25140 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
25150 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
25160 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
25170 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
25180 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
25190 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
251a0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
251b0 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
251c0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
251d0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
251e0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
251f0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
25200 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
25210 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
25220 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25230 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
25240 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
25250 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
25260 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
25270 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
25280 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25290 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
252a0 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
252b0 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
252c0 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
252d0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
252e0 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
252f0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
25300 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
25310 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
25320 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
25330 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
25340 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
25350 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
25360 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25370 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
25380 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
25390 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
253a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
253b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
253c0 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
253d0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
253e0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
253f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
25400 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
25410 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25420 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
25430 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
25440 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
25460 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
25470 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
25480 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
25490 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
254a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
254b0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
254c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
254d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
254e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
254f0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25500 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
25510 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25520 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25530 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
25540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25550 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
25560 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25570 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25580 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
25590 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
255a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
255b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
255c0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
255d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
255e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
255f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25600 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25610 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
25620 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25640 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
25650 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
25660 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
25670 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
25680 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25690 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
256a0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
256b0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
256c0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
256d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
256e0 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
256f0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
25700 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
25710 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
25720 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
25730 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
25740 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
25750 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
25760 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
25770 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
25780 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
25790 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
257a0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
257b0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
257c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
257d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
257e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
257f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
25800 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
25810 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
25820 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
25830 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
25840 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
25850 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
25860 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25870 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25880 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
25890 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
258a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
258b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
258c0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
258d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
258e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
258f0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
25900 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
25910 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
25920 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
25930 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25940 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
25950 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
25960 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
25970 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
25980 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25990 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
259a0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
259b0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
259c0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
259d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
259e0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
259f0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
25a00 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
25a10 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
25a20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25a30 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
25a40 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
25a50 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25a60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25a70 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
25a80 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25a90 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25aa0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
25ab0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
25ac0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
25ad0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25ae0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
25af0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
25b00 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
25b10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
25b20 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
25b30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25b40 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
25b50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25b60 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25b70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25b80 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
25b90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25ba0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
25bb0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
25bc0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
25bd0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
25be0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
25bf0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
25c00 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
25c10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
25c20 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
25c30 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
25c40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
25c50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
25c60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
25c70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
25c80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
25c90 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
25ca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
25cb0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
25cc0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25cd0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
25ce0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
25cf0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
25d00 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
25d10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25d20 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25d30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25d40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
25d50 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
25d60 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25d70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
25d80 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
25d90 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
25da0 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
25db0 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
25dc0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
25dd0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
25de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25df0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
25e00 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
25e10 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
25e20 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
25e30 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
25e40 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
25e50 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
25e60 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
25e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25e80 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
25e90 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
25ea0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
25eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ec0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
25ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ee0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
25ef0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
25f00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25f10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
25f20 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
25f30 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
25f40 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
25f50 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
25f60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25f70 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
25f80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
25f90 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
25fa0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
25fb0 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
25fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25fd0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
25fe0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
25ff0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
26000 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
26010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26020 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
26030 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
26040 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
26050 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
26060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26070 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26080 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26090 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
260a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
260b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
260c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
260d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
260e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
260f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26100 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26110 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
26120 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
26130 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
26140 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
26150 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
26160 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
26170 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
26180 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
26190 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
261a0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
261b0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
261c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
261d0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
261e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
261f0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
26200 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
26210 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
26220 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
26230 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
26240 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
26250 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
26260 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
26270 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26280 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
26290 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
262a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
262b0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
262c0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
262d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
262e0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
262f0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
26300 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
26310 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
26320 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
26330 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26340 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
26350 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26360 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
26370 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
26380 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
26390 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
263a0 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
263b0 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
263c0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
263d0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
263e0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
263f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
26400 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
26410 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
26420 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
26430 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
26440 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
26450 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
26460 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
26470 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
26480 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
26490 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
264a0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
264c0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
264d0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
264e0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
264f0 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
26500 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
26510 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
26520 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
26530 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26550 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
26560 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
26570 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
26580 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
26590 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
265a0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
265b0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
265c0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
265d0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
265e0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
265f0 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
26600 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
26610 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
26620 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
26630 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
26640 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
26650 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
26660 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
26670 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
26680 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
26690 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
266a0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
266b0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
266c0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
266d0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
266e0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
266f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
26700 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
26710 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
26720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
26730 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
26740 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
26750 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
26760 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
26770 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
26780 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
26790 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
267a0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
267b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
267c0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
267d0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
267e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
267f0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
26800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
26810 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
26820 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
26830 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
26840 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
26850 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
26860 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
26870 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
26880 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26890 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
268a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
268b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
268c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
268d0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
268e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
268f0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
26900 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
26910 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26920 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26930 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
26940 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26960 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26980 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
26990 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
269a0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
269b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
269c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
269d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
269e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
269f0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26a00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
26a10 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
26a20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26a30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26a40 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
26a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26a60 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26a70 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26a80 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26a90 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
26aa0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
26ab0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
26ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26ad0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
26ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26af0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
26b00 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
26b10 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26b20 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
26b30 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26b40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26b50 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26b60 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26b70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26b80 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
26b90 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
26ba0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
26bb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
26bc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26bd0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
26be0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
26bf0 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
26c00 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
26c10 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
26c20 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
26c30 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
26c40 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
26c50 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
26c60 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
26c70 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
26c80 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26c90 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26ca0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26cb0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26cc0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26cd0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
26ce0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
26cf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26d00 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26d10 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26d20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26d30 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26d40 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26d50 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
26d60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26d70 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26d80 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26d90 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26da0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26db0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
26dc0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
26dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26de0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
26df0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26e00 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
26e10 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
26e20 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
26e30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26e40 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
26e50 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
26e60 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
26e70 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
26e80 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26e90 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
26ea0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
26eb0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
26ec0 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
26ed0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26ee0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
26ef0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
26f00 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26f10 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
26f20 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26f30 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
26f40 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
26f50 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26f60 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
26f70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26f80 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
26f90 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
26fa0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26fb0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26fc0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
26fd0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26fe0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
26ff0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
27000 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
27010 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
27020 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27030 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27040 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
27050 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27060 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27070 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27080 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27090 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
270a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
270b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
270c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
270d0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
270e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
270f0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27100 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27110 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
27120 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
27130 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
27140 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
27150 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
27160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27170 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
27180 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27190 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
271a0 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
271b0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
271c0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
271d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
271e0 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
271f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27200 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
27210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
27220 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
27230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27240 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
27250 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
27260 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27270 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
27280 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
27290 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
272a0 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
272b0 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
272c0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
272d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
272e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
272f0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
27300 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
27310 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
27320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27330 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27340 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
27350 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
27360 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
27370 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
27380 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
27390 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
273a0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
273b0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
273c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
273d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
273e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
273f0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
27400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
27410 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27420 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27430 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27440 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  : .      if( exp
27450 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
27460 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
27470 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
27480 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
27490 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
274a0 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
274b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
274c0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
274d0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
274e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
274f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27500 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
27510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27520 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
27530 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
27540 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
27550 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
27560 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
27570 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27580 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27590 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
275a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
275b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
275c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
275d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
275e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
275f0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
27600 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27610 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
27620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
27630 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27640 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
27650 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
27660 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
27670 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
27680 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
27690 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
276a0 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
276b0 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
276c0 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
276d0 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
276e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
276f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
27700 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
27710 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
27720 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
27730 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
27740 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
27750 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
27760 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
27770 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
27780 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
27790 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
277a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
277b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
277c0 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
277d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
277e0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
277f0 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
27800 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
27810 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
27820 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
27830 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
27840 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
27850 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
27860 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
27870 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
27880 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
27890 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
278a0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
278b0 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
278c0 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
278d0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
278e0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
278f0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
27900 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
27910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
27920 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
27930 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
27940 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
27950 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
27960 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
27970 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
27980 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
27990 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
279a0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
279b0 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
279c0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
279d0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
279e0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
279f0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
27a00 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
27a10 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
27a20 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
27a30 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
27a40 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
27a50 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
27a60 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
27a70 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
27a80 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
27a90 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
27aa0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
27ab0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
27ac0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
27ad0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
27ae0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
27af0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
27b00 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
27b10 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
27b20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
27b30 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
27b40 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
27b50 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
27b60 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
27b70 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
27b80 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
27b90 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
27ba0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
27bb0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
27bc0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
27bd0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
27be0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
27bf0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
27c00 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
27c10 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
27c20 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
27c30 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
27c40 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
27c50 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
27c60 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
27c70 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
27c80 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
27c90 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
27ca0 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
27cb0 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
27cc0 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
27cd0 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
27ce0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
27cf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
27d00 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
27d10 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
27d20 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
27d30 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
27d40 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
27d50 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
27d60 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
27d70 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
27d80 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
27d90 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
27da0 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
27db0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
27dc0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
27dd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
27de0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
27df0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
27e00 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
27e10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
27e20 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
27e30 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
27e40 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
27e50 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
27e60 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
27e70 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
27e80 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
27e90 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
27ea0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
27eb0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
27ec0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
27ed0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
27ee0 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
27ef0 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
27f00 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  n ){.    if( pA-
27f10 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
27f20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
27f30 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
27f40 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
27f50 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
27f60 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
27f70 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
27f80 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
27f90 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
27fa0 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
27fb0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
27fc0 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
27fd0 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
27fe0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
27ff0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
28000 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
28010 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
28020 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
28030 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
28040 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
28050 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
28060 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
28070 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
28080 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
28090 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
280a0 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
280b0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
280c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
280d0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
280e0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
280f0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
28100 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
28110 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
28120 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
28130 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
28140 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
28150 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
28160 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
28170 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
28180 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
28190 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
281a0 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
281b0 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
281c0 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
281d0 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
281e0 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
281f0 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
28200 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
28210 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
28220 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
28230 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
28240 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
28250 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
28260 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
28270 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
28280 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
28290 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
282a0 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
282b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
282c0 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
282d0 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
282e0 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
282f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
28300 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
28310 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
28320 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
28330 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
28340 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
28350 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
28360 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
28370 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
28380 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
28390 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
283a0 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
283b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
283c0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
283d0 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
283e0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
283f0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
28400 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
28410 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
28420 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
28430 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
28440 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
28450 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
28460 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
28470 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
28480 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
28490 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
284a0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
284b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
284c0 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
284d0 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
284e0 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
284f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
28500 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
28510 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
28520 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
28530 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
28540 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
28550 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
28560 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
28570 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
28580 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
28590 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
285a0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
285b0 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
285c0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
285d0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
285e0 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
285f0 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
28600 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28610 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
28620 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
28630 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
28640 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28650 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
28660 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
28670 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
28680 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
28690 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
286a0 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
286b0 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
286c0 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
286d0 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
286e0 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
286f0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
28700 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
28710 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
28720 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
28730 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
28740 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
28750 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
28760 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
28770 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
28780 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
28790 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
287a0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
287b0 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
287c0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
287d0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
287e0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
287f0 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
28800 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
28810 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
28820 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
28830 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
28840 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
28850 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
28860 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
28870 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
28880 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
28890 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
288a0 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
288b0 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
288c0 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
288d0 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
288e0 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
288f0 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
28900 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
28910 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
28920 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
28930 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
28940 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
28950 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
28960 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
28970 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
28980 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
28990 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
289a0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
289b0 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
289c0 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
289d0 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
289e0 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
289f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
28a00 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
28a10 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
28a20 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
28a30 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
28a40 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
28a50 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
28a60 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
28a70 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
28a80 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
28a90 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
28aa0 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
28ab0 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
28ac0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
28ad0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
28ae0 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
28af0 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
28b00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
28b10 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
28b20 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d  _NOTNULL && pE1-
28b30 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
28b40 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
28b50 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58   ){.    Expr *pX
28b60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
28b70 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70  ipCollate(pE1->p
28b80 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Left);.    testc
28b90 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c  ase( pX!=pE1->pL
28ba0 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73  eft );.    if( s
28bb0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
28bc0 65 28 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74  e(pX, pE2->pLeft
28bd0 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , iTab)==0 ) ret
28be0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
28bf0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
28c00 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
28c10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
28c20 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
28c30 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
28c40 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  r.** to determin
28c50 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  e if an expressi
28c60 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  on can be evalua
28c70 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65  ted by reference
28c80 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78   to the.** index
28c90 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68   only, without h
28ca0 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65  aving to do a se
28cb0 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72  arch for the cor
28cc0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61  responding.** ta
28cd0 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ble entry.  The 
28ce0 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69  IdxCover.pIdx fi
28cf0 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78  eld is the index
28d00 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72  .  IdxCover.iCur
28d10 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f  .** is the curso
28d20 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  r for the table.
28d30 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f  .*/.struct IdxCo
28d40 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ver {.  Index *p
28d50 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
28d60 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
28d70 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
28d80 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
28d90 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
28da0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
28db0 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  able correspondi
28dc0 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ng to the index 
28dd0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
28de0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
28df0 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  re are reference
28e00 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
28e10 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65  table .** pWalke
28e20 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
28e30 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69  iCur can be sati
28e40 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  sfied using the 
28e50 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72  index.** pWalker
28e60 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
28e70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Idx..*/.static i
28e80 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28  nt exprIdxCover(
28e90 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28ea0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
28eb0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
28ec0 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
28ed0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
28ee0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
28ef0 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20  ver->iCur.   && 
28f00 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
28f10 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e  ndex(pWalker->u.
28f20 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c  pIdxCover->pIdx,
28f30 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
28f40 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  <0.  ){.    pWal
28f50 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
28f60 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
28f70 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  bort;.  }.  retu
28f80 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
28fa0 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20  ine if an index 
28fb0 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69  pIdx on table wi
28fc0 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63  th cursor iCur c
28fd0 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20  ontains will.** 
28fe0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
28ff0 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72  Expr.  Return tr
29000 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ue if the index 
29010 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a  does cover the.*
29020 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
29030 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45   false if the pE
29040 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72  xpr expression r
29050 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20  eferences table 
29060 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20  columns.** that 
29070 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  are not found in
29080 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e   the index pIdx.
29090 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20  .**.** An index 
290a0 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72  covering an expr
290b0 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  ession means tha
290c0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
290d0 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75   can be.** evalu
290e0 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20  ated using only 
290f0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69  the index and wi
29100 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
29110 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f  lookup the.** co
29120 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
29130 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20  e entry..*/.int 
29140 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72  sqlite3ExprCover
29150 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70  edByIndex(.  Exp
29160 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
29170 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
29180 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20   be tested */.  
29190 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
291a0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
291b0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
291c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
291d0 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  able */.  Index 
291e0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
291f0 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
29200 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f  might be used fo
29210 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b  r coverage */.){
29220 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
29230 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78  truct IdxCover x
29240 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  cov;.  memset(&w
29250 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
29260 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69  .  xcov.iCur = i
29270 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78  Cur;.  xcov.pIdx
29280 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78   = pIdx;.  w.xEx
29290 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
292a0 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75  rIdxCover;.  w.u
292b0 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63  .pIdxCover = &xc
292c0 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ov;.  sqlite3Wal
292d0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
292e0 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43  ;.  return !w.eC
292f0 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  ode;.}.../*.** A
29300 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
29310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
29320 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
29330 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
29340 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66  .** to count ref
29350 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
29360 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
29370 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20  arguments of an 
29380 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75  .** aggregate fu
29390 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72  nction, in order
293a0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
293b0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63  e.** sqlite3Func
293c0 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f  tionThisSrc() ro
293d0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  utine..*/.struct
293e0 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72   SrcCount {.  Sr
293f0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f  cList *pSrc;   /
29400 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72  * One particular
29410 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
29420 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a  a nested query *
29430 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20  /.  int nThis;  
29440 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29450 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
29460 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c  columns in pSrcL
29470 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74  ist */.  int nOt
29480 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  her;      /* Num
29490 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
294a0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
294b0 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
294c0 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
294d0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
294e0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
294f0 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74  o columns..*/.st
29500 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63  atic int exprSrc
29510 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  Count(Walker *pW
29520 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
29530 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45  pr){.  /* The NE
29540 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63  VER() on the sec
29550 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61  ond term is beca
29560 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74  use sqlite3Funct
29570 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
29580 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
29590 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71  called before sq
295a0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
295b0 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64  Aggregates() and
295c0 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f   so the.  ** TK_
295d0 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74  COLUMNs have not
295e0 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72   yet been conver
295f0 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  ted into TK_AGG_
29600 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a  COLUMN.  If.  **
29610 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
29620 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73  UsesThisSrc() is
29630 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c   used differentl
29640 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  y in the future,
29650 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28   the.  ** NEVER(
29660 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  ) will need to b
29670 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  e removed. */.  
29680 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
29690 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45  K_COLUMN || NEVE
296a0 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  R(pExpr->op==TK_
296b0 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20  AGG_COLUMN) ){. 
296c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
296d0 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70  ruct SrcCount *p
296e0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
296f0 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63  rcCount;.    Src
29700 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
29710 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53  pSrc;.    int nS
29720 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63  rc = pSrc ? pSrc
29730 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20  ->nSrc : 0;.    
29740 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b  for(i=0; i<nSrc;
29750 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
29760 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
29770 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
29780 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
29790 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63  }.    if( i<nSrc
297a0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68   ){.      p->nTh
297b0 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  is++;.    }else{
297c0 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
297d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
297e0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
297f0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
29800 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
29810 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
29820 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
29830 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
29840 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
29850 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
29860 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
29870 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
29880 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
29890 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
298a0 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
298b0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
298c0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
298d0 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
298e0 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
298f0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
29900 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
29910 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
29920 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
29930 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
29940 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
29950 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
29960 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
29970 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
29980 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
29990 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
299a0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   );.  memset(&w,
299b0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
299c0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
299d0 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
299e0 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
299f0 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
29a00 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
29a10 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
29a20 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
29a30 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
29a40 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
29a50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
29a60 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
29a70 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
29a80 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
29a90 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
29aa0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
29ab0 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
29ac0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
29ad0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
29ae0 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
29af0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
29b00 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
29b10 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
29b20 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
29b30 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
29b40 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
29b50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
29b60 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
29b70 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
29b80 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
29b90 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
29ba0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
29bb0 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
29bc0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
29bd0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
29be0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
29bf0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
29c00 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
29c10 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
29c20 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
29c30 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
29c40 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
29c50 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
29c60 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
29c70 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
29c80 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
29c90 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
29ca0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
29cb0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
29cc0 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
29cd0 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
29ce0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
29cf0 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
29d00 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
29d10 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
29d20 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
29d30 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
29d40 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
29d50 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
29d60 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
29d70 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
29d80 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
29d90 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
29da0 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
29db0 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
29dc0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
29dd0 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
29de0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
29df0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
29e00 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
29e10 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
29e20 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
29e30 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
29e40 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
29e50 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
29e60 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
29e70 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
29e80 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
29e90 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
29ea0 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
29eb0 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
29ec0 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
29ed0 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
29ee0 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
29ef0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
29f00 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
29f10 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
29f20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
29f30 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
29f40 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
29f50 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
29f60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
29f70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
29f80 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
29f90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
29fa0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
29fb0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
29fc0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
29fd0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
29fe0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
29ff0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
2a000 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
2a010 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
2a020 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2a030 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
2a040 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
2a050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2a060 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
2a070 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2a080 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2a090 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2a0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2a0b0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a0c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2a0d0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2a0e0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2a0f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2a100 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2a110 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
2a120 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
2a130 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
2a140 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
2a150 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
2a160 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2a170 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
2a180 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2a190 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2a1a0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
2a1b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2a1c0 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
2a1d0 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
2a1e0 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
2a1f0 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
2a200 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2a210 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
2a220 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2a230 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2a240 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
2a250 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2a260 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
2a270 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
2a280 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
2a290 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
2a2a0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
2a2b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2a2c0 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
2a2d0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a2f0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
2a300 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2a320 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2a330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a340 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a350 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
2a360 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
2a370 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
2a380 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2a390 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2a3a0 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
2a3b0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2a3c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2a3d0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
2a3e0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
2a3f0 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
2a400 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
2a410 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2a420 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
2a430 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
2a440 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2a450 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
2a460 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
2a470 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
2a480 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2a490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a4a0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2a4b0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2a4c0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
2a4d0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2a4e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
2a4f0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2a500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a510 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
2a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2a530 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
2a540 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2a550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a560 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a570 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
2a580 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
2a590 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
2a5a0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2a5b0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2a5c0 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
2a5d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2a5e0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
2a5f0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2a620 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
2a630 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2a640 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2a660 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2a670 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a690 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2a6a0 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2a6c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2a6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a6e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a6f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a700 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2a710 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2a720 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2a730 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2a740 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
2a750 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
2a760 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
2a770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a790 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2a7a0 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
2a7b0 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
2a7c0 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
2a7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2a7e0 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
2a7f0 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
2a800 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
2a810 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
2a820 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
2a830 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
2a840 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
2a850 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
2a860 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
2a870 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
2a880 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
2a890 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a8a0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2a8b0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2a8c0 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2a8d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2a8e0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2a8f0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
2a900 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
2a910 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
2a920 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2a930 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
2a940 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2a950 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
2a960 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
2a970 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
2a980 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
2a990 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
2a9a0 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
2a9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2a9c0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2a9d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
2a9e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
2a9f0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
2aa00 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
2aa10 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
2aa20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
2aa30 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
2aa40 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
2aa50 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2aa60 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
2aa70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
2aa80 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
2aa90 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
2aaa0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
2aab0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2aac0 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
2aad0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
2aae0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2aaf0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
2ab00 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
2ab10 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
2ab20 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2ab30 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2ab40 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2ab50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2ab60 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
2ab70 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d  >pExpr, pExpr, -
2ab80 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
2ab90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2abb0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
2abc0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
2abd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2abe0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
2abf0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
2ac00 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
2ac10 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
2ac20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ac30 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
2ac40 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
2ac50 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
2ac60 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
2ac70 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
2ac80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
2ac90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2aca0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2acb0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2acc0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2acd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2ace0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
2acf0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
2ad00 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2ad10 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2ad20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2ad30 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2ad40 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2ad50 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2ad60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2ad70 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
2ad80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2ad90 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
2ada0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
2adb0 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
2ade0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
2adf0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
2ae00 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
2ae10 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
2ae20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
2ae30 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2ae40 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
2ae50 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2ae60 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2ae70 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
2ae80 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2ae90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2aeb0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
2aec0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2aed0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2aee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2aef0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
2af00 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
2af10 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
2af20 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
2af30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2af40 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2af50 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2af60 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2af70 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2af80 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2af90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2afa0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2afb0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2afc0 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
2afd0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2afe0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2aff0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2b000 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2b010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
2b020 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2b030 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2b040 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2b050 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
2b060 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2b070 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2b080 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
2b090 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2b0a0 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2b0b0 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72  ARAMETER(pWalker
2b0c0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2b0d0 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2b0e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2b0f0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2b100 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
2b110 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
2b120 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
2b130 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2b140 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
2b150 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2b160 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
2b170 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
2b180 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
2b190 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
2b1a0 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
2b1b0 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
2b1c0 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
2b1d0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
2b1e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b1f0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2b200 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
2b210 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
2b220 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
2b230 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
2b240 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
2b250 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2b260 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2b270 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
2b280 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
2b290 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
2b2a0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2b2b0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
2b2c0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2b2d0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2b2e0 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
2b2f0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2b300 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2b310 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  ct;.  w.u.pNC = 
2b320 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
2b330 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
2b340 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
2b350 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
2b360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
2b370 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2b380 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
2b390 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
2b3a0 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
2b3b0 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
2b3c0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2b3d0 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
2b3e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
2b3f0 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
2b400 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
2b410 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2b420 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b430 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
2b440 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
2b450 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
2b460 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2b470 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
2b480 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2b490 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
2b4a0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
2b4b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
2b4c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2b4d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2b4e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
2b4f0 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
2b500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2b510 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2b520 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
2b530 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
2b540 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
2b550 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
2b560 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2b570 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2b580 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
2b590 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
2b5a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
2b5b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2b5c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
2b5d0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
2b5e0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
2b5f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
2b600 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
2b610 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
2b620 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
2b630 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
2b640 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  urpose..**.** If
2b650 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63   a register is c
2b660 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75  urrently being u
2b670 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d  sed by the colum
2b680 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a  n cache, then.**
2b690 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f   the deallocatio
2b6a0 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
2b6b0 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
2b6c0 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
2b6d0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
2b6e0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
2b6f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2b700 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2b710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2b720 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
2b730 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
2b740 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
2b750 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
2b760 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
2b770 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
2b780 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
2b790 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
2b7a0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
2b7b0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
2b7c0 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
2b7d0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
2b7e0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
2b7f0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
2b800 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b820 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2b830 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2b840 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2b850 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2b860 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2b870 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2b880 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2b890 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2b8a0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2b8b0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2b8c0 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2b8d0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2b8e0 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2b8f0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2b900 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2b910 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2b920 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2b930 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2b940 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2b950 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
2b960 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
2b970 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
2b980 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
2b990 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2b9a0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2b9b0 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2b9c0 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2b9d0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2b9e0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2b9f0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2ba00 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2ba10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2ba20 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2ba30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2ba40 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2ba50 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2ba60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2ba70 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2ba80 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2ba90 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
2baa0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
2bab0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
2bac0 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
2bad0 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
2bae0 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
2baf0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2bb00 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2bb10 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
2bb20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2bb30 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
2bb40 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
2bb50 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
2bb60 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
2bb70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2bb80 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2bb90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2bba0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
2bbb0 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
2bbc0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2bbd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
2bbe0 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
2bbf0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
2bc00 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
2bc10 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
2bc20 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
2bc30 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
2bc40 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
2bc50 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
2bc60 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
2bc70 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
2bc80 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
2bc90 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
2bca0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2bcb0 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
2bcc0 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
2bcd0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
2bce0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
2bcf0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2bd00 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
2bd10 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a  nRangeReg<iLast.
2bd20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2bd30 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a  angeReg>=iFirst.
2bd40 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e    ){.     return
2bd50 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
2bd60 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
2bd70 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
2bd80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65   if( pParse->aTe
2bd90 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74  mpReg[i]>=iFirst
2bda0 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d   && pParse->aTem
2bdb0 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29  pReg[i]<=iLast )
2bdc0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
2bdd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2bde0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2bdf0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
2be00 20 2a 2f 0a                                       */.