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

Artifact d29114e9b709eaeaaa18553a5bbe60a19302aeef:


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 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  bOk;.      if( n
7d80: 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  ==2 ){ /*OPTIMIZ
7d90: 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
7da0: 20 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d          i = z[1]
7db0: 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f  -'0';  /* The co
7dc0: 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20  mmon case of ?N 
7dd0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67  for a single dig
7de0: 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  it N */.        
7df0: 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
7e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f  else{.        bO
7e10: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
7e20: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
7e30: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
7e40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7e50: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
7e60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7e70: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
7e80: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
7e90: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7ea0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7eb0: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
7ec0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
7ed0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7ee0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7ef0: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
7f00: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
7f10: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
7f20: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7f30: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7f50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7f60: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
7f70: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
7f80: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
7f90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
7fa0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7fb0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7fc0: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
7fd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7fe0: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
7ff0: 72 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78  r)i;.      if( x
8000: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
8010: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
8020: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a  >nVar = (int)x;.
8030: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8040: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8050: 66 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  f( sqlite3VListN
8060: 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
8070: 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29  >pVList, x)==0 )
8080: 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  {.        doAdd 
8090: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
80a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
80b0: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
80c0: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
80d0: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
80e0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
80f0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  le.      ** numb
8100: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
8110: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
8120: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
8130: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
8140: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
8150: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
8160: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
8170: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
8180: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20       */.      x 
8190: 3d 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33  = (ynVar)sqlite3
81a0: 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70  VListNameToNum(p
81b0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
81c0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
81d0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
81e0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
81f0: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
8200: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
8210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8220: 20 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20    if( doAdd ){. 
8230: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
8240: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69  ist = sqlite3VLi
8250: 73 74 41 64 64 28 64 62 2c 20 70 50 61 72 73 65  stAdd(db, pParse
8260: 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20  ->pVList, z, n, 
8270: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
8280: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8290: 20 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e   x;.  if( x>db->
82a0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
82b0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
82c0: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
82d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
82e0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
82f0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
8300: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
8310: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
8320: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8330: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
8340: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
8350: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8360: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
8370: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61  b, Expr *p){.  a
8380: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
8390: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
83a0: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
83b0: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
83c0: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
83d0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
83e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
83f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
8400: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
8410: 61 6c 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65  alue>=0 );.#ifde
8420: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8430: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8440: 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29  erty(p, EP_Leaf)
8450: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
8460: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8470: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
8480: 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30  ert( p->pLeft==0
8490: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
84a0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
84b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
84c0: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
84d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
84e0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
84f0: 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (p, (EP_TokenOnl
8500: 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20  y|EP_Leaf)) ){. 
8510: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
8520: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
8530: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
8540: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
8550: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
8560: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
8570: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
8580: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
8590: 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d  pLeft && p->op!=
85a0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
85b0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
85c0: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c  leteNN(db, p->pL
85d0: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
85e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
85f0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
8600: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8610: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
8620: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ect) ){.      sq
8630: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
8640: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  e(db, p->x.pSele
8650: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
8660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8670: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
8680: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  p->x.pList);.   
8690: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70   }.  }.  if( Exp
86a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
86b0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73  EP_MemToken) ) s
86c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
86d0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
86e0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
86f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74  perty(p, EP_Stat
8700: 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ic) ){.    sqlit
8710: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
8720: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8730: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
8740: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8750: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
8760: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8770: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8780: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8790: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
87a0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
87b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
87c0: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
87d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
87e0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
87f0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
8800: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
8810: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8820: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
8830: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
8840: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
8850: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
8860: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8870: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8880: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8890: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
88a0: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
88b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
88c0: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
88d0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
88e0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
88f0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
8900: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8910: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
8920: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
8930: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8940: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
8950: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
8960: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
8970: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8980: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8990: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
89a0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
89b0: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
89c0: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
89d0: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
89e0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
89f0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
8a00: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
8a10: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
8a20: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
8a30: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
8a40: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
8a50: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
8a60: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
8a70: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8a80: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
8a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8ad0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8ae0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
8af0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8b00: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
8b10: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
8b20: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
8b30: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
8b40: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8b50: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8b60: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8b70: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8b80: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8b90: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8ba0: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8bb0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8bc0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8bd0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8be0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
8bf0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
8c00: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
8c10: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
8c20: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
8c30: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
8c40: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8c50: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
8c60: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8c70: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
8c80: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
8c90: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
8ca0: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
8cb0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
8cc0: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
8cd0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
8ce0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
8cf0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
8d00: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
8d10: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
8d20: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
8d30: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
8d40: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
8d50: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
8d60: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
8d70: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
8d80: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
8d90: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
8da0: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
8db0: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
8dc0: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
8dd0: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
8de0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
8df0: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
8e00: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
8e10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
8e20: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
8e30: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
8e40: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
8e50: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
8e60: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
8e70: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
8e80: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
8e90: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
8ea0: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
8eb0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
8ec0: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
8ed0: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
8ee0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
8ef0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
8f00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
8f10: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
8f20: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
8f30: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
8f40: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
8f50: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
8f60: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
8f70: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
8f80: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
8f90: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8fa0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
8fb0: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
8fc0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
8fd0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8fe0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
8ff0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
9000: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
9010: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
9020: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
9030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
9040: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
9050: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
9060: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
9070: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9080: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9090: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
90a0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20  EXPR_FULLSIZE;. 
90b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
90c0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
90d0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
90e0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
90f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9100: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9110: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
9120: 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28   ); .    assert(
9130: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9140: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
9150: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9160: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9170: 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  y(p, EP_NoReduce
9180: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ) );.    if( p->
9190: 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c  pLeft || p->x.pL
91a0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ist ){.      nSi
91b0: 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45  ze = EXPR_REDUCE
91c0: 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63  DSIZE | EP_Reduc
91d0: 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ed;.    }else{. 
91e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
91f0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
9200: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9210: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
9220: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
9230: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9240: 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nSize;.}../*.**
9250: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9260: 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65  eturns the space
9270: 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72   in bytes requir
9280: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
9290: 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20  copy .** of the 
92a0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61  Expr structure a
92b0: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
92c0: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73   Expr.u.zToken s
92d0: 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a  tring (if that.*
92e0: 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69  * string is defi
92f0: 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ned.).*/.static 
9300: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
9310: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
9320: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
9330: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
9340: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
9350: 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a  flags) & 0xfff;.
9360: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
9370: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
9380: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
9390: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79  Token ){.    nBy
93a0: 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
93b0: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
93c0: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
93d0: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
93e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
93f0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9400: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9410: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
9420: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
9430: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
9440: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
9450: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
9460: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
9470: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
9480: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
9490: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
94a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
94b0: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
94c0: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
94d0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
94e0: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
94f0: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
9500: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
9510: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
9520: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
9530: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
9540: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
9550: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
9560: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
9570: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
9580: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
9590: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
95a0: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
95b0: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
95c0: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
95d0: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
95e0: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
95f0: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
9600: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
9610: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
9620: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
9630: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
9640: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9650: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
9660: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9670: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
9680: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
9690: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
96a0: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
96b0: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
96c0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
96d0: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
96e0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
96f0: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
9700: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
9710: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
9720: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9730: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
9740: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9750: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
9760: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
9770: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
9780: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
9790: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
97a0: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
97b0: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
97c0: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
97d0: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
97e0: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
97f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
9800: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
9810: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
9820: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
9830: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
9840: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
9850: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
9860: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
9870: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
9880: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
9890: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
98a0: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a  t byte past the.
98b0: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
98c0: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
98d0: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
98e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
98f0: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
9900: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9910: 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67   *p, int dupFlag
9920: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
9930: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
9940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
9950: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
9960: 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20  .  u8 *zAlloc;  
9970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
9980: 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68  ry space from wh
9990: 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70  ich to build Exp
99a0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  r object */.  u3
99b0: 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20  2 staticFlag;   
99c0: 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63      /* EP_Static
99d0: 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62   if space not ob
99e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
99f0: 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  oc */..  assert(
9a00: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
9a10: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
9a20: 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c  t( dupFlags==0 |
9a30: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
9a40: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
9a50: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
9a60: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
9a70: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9a80: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
9a90: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
9aa0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
9ab0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
9ac0: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
9ad0: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
9ae0: 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74  Buffer;.    stat
9af0: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
9b00: 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
9b10: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
9b20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
9b30: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
9b40: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a  (p, dupFlags));.
9b50: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9b60: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d   0;.  }.  pNew =
9b70: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
9b80: 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
9b90: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
9ba0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
9bb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
9bc0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
9bd0: 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79  ted to.    ** by
9be0: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
9bf0: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
9c00: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
9c10: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20  DSIZE or.    ** 
9c20: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9c30: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
9c40: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
9c50: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
9c60: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
9c70: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75  copy of the p->u
9c80: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
9c90: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
9ca0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
9cb0: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
9cc0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9cd0: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9ce0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
9cf0: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
9d00: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
9d10: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b  .    int nToken;
9d20: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
9d30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9d40: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
9d50: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
9d60: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
9d70: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
9d80: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
9d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54   }else{.      nT
9da0: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  oken = 0;.    }.
9db0: 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73      if( dupFlags
9dc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9dd0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9de0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
9df0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==0 );.      mem
9e00: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9e10: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  NewSize);.    }e
9e20: 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  lse{.      u32 n
9e30: 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72  Size = (u32)expr
9e40: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
9e50: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
9e60: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
9e70: 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45       if( nSize<E
9e80: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20  XPR_FULLSIZE ){ 
9e90: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
9ea0: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
9eb0: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
9ec0: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
9ed0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9ee0: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
9ef0: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
9f00: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
9f10: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
9f20: 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ly. */.    pNew-
9f30: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
9f40: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9f50: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
9f60: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
9f70: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
9f80: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
9f90: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9fa0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77  nOnly);.    pNew
9fb0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
9fc0: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  cFlag;..    /* C
9fd0: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
9fe0: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
9ff0: 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ny. */.    if( n
a000: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  Token ){.      c
a010: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
a020: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
a030: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
a040: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d  ewSize];.      m
a050: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
a060: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
a070: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
a080: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
a090: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
a0a0: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
a0b0: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20  _Leaf)) ){.     
a0c0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
a0d0: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a0e0: 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  or pNew->x.pList
a0f0: 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   member. */.    
a100: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a110: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
a120: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a130: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
a140: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a150: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
a160: 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29  elect, dupFlags)
a170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a180: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a190: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
a1a0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a1b0: 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61  >x.pList, dupFla
a1c0: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
a1d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   }..    /* Fill 
a1e0: 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61  in pNew->pLeft a
a1f0: 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e  nd pNew->pRight.
a200: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
a210: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a220: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
a230: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
a240: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
a250: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a260: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a270: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a280: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a290: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a2a0: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
a2b0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a2c0: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a2e0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a2f0: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
a300: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a310: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
a320: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
a330: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a350: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
a360: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
a370: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a390: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a3a0: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
a3b0: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
a3c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a3d0: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a3e0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a3f0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
a400: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  f) ){.        if
a410: 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53  ( pNew->op==TK_S
a420: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
a430: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
a440: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a450: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
a460: 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  rt( p->iColumn==
a470: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
a480: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
a490: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
a4a0: 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68  ==0  || p->pRigh
a4b0: 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  t==p->pLeft );. 
a4c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a4d0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a4e0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
a4f0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
a500: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
a510: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a520: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
a530: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
a540: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
a550: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
a560: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
a570: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
a580: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
a590: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
a5a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
a5b0: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
a5c0: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
a5d0: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
a5e0: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
a5f0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
a600: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
a610: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
a620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a630: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
a640: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
a650: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
a660: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
a670: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
a680: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
a690: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
a6a0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
a6b0: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
a6c0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
a6d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a6e0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
a6f0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
a700: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
a710: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
a720: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a730: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
a740: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
a750: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
a760: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a770: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
a780: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
a790: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
a7a0: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
a7b0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
a7c0: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
a7d0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a7e0: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
a7f0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
a800: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
a810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a820: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
a830: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
a840: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
a850: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
a860: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
a870: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
a880: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
a890: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
a8a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
a8b0: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
a8c0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
a8d0: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
a8e0: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
a8f0: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
a900: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
a910: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
a920: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
a930: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
a940: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
a950: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
a960: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
a970: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
a980: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
a990: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
a9a0: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
a9b0: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
a9c0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
a9d0: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
a9e0: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
a9f0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
aa00: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
aa10: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
aa20: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
aa30: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
aa40: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
aa50: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
aa60: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
aa70: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
aa80: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
aa90: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
aaa0: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
aab0: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
aac0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
aad0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
aae0: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
aaf0: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
ab00: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
ab10: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
ab20: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
ab30: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
ab40: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
ab50: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
ab60: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
ab70: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
ab80: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
ab90: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
aba0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
abb0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
abc0: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
abd0: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
abe0: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
abf0: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
ac00: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
ac10: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
ac20: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ac30: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
ac40: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
ac50: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
ac60: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
ac70: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ac80: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
ac90: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
aca0: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
acb0: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
acc0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
acd0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ace0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
acf0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ad00: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
ad10: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
ad20: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
ad30: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
ad40: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
ad50: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
ad60: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
ad70: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
ad80: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
ad90: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
ada0: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
adb0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
adc0: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
add0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
ade0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
adf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ae00: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
ae10: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
ae20: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
ae30: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
ae40: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
ae50: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
ae60: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
ae70: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
ae80: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  pr;.    Expr *pN
ae90: 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ewExpr;.    pIte
aea0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
aeb0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
aec0: 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a  ldExpr, flags);.
aed0: 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72      if( pOldExpr
aee0: 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78   .     && pOldEx
aef0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
af00: 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  T_COLUMN.     &&
af10: 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74   (pNewExpr = pIt
af20: 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20  em->pExpr)!=0 . 
af30: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
af40: 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  rt( pNewExpr->iC
af50: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20  olumn==0 || i>0 
af60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
af70: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
af80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
af90: 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70  ert( pOldExpr->p
afa0: 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e  Left==pOldExpr->
afb0: 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  pRight );.      
afc0: 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f    pPriorSelectCo
afd0: 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c  l = pNewExpr->pL
afe0: 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e  eft = pNewExpr->
aff0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65  pRight;.      }e
b000: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
b010: 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
b020: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b030: 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29  m[-1].pExpr!=0 )
b040: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b050: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b060: 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  umn==pItem[-1].p
b070: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20  Expr->iColumn+1 
b080: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b090: 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43  t( pPriorSelectC
b0a0: 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  ol==pItem[-1].pE
b0b0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
b0c0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e        pNewExpr->
b0d0: 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65  pLeft = pPriorSe
b0e0: 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  lectCol;.      }
b0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d  .    }.    pItem
b100: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
b110: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b120: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
b130: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
b140: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b150: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b160: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
b170: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
b180: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
b190: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
b1a0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
b1b0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
b1c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
b1d0: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
b1e0: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
b1f0: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
b200: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
b210: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
b220: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
b230: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
b240: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
b250: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
b260: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
b270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
b280: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
b290: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
b2a0: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
b2b0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
b2c0: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
b2d0: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
b2e0: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
b2f0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
b300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b310: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
b320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b330: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
b340: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b350: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
b360: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
b370: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b380: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
b390: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
b3a0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
b3b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
b3c0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  te;.  assert( db
b3d0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b3e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b3f0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
b400: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
b410: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
b420: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
b430: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
b440: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b450: 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  wNN(db, nByte );
b460: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b480: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
b490: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
b4a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b4b0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
b4c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
b4d0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
b4e0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
b4f0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b500: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
b510: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
b520: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b530: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
b540: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
b550: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
b560: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
b570: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b580: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b590: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
b5a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
b5b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b5c0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b5d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
b5e0: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
b5f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b600: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
b610: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
b620: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
b630: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
b640: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
b650: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
b660: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
b670: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
b680: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
b690: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
b6a0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
b6b0: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
b6c0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
b6d0: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
b6e0: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
b6f0: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
b700: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
b710: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b720: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
b730: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
b740: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
b750: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
b760: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
b770: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
b780: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
b790: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
b7a0: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
b7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b7c0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
b7d0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b7e0: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
b7f0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
b800: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
b810: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
b820: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
b830: 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
b840: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
b850: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
b860: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
b870: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b880: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
b890: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b8a0: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
b8b0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b8c0: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
b8d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
b8e0: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
b8f0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
b900: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
b910: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
b920: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
b930: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
b940: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
b950: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
b960: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b970: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
b980: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
b990: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
b9a0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b9b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b9c0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b9d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b9e0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  N(db, sizeof(*pN
b9f0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
ba00: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
ba10: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
ba20: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
ba30: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ba40: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e  ocRawNN(db, p->n
ba50: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
ba60: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
ba70: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
ba80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ba90: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
baa0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
bab0: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
bac0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bad0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
bae0: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
baf0: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
bb00: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
bb10: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
bb20: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
bb30: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
bb40: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
bb50: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
bb60: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
bb70: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
bb80: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
bb90: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
bba0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
bbb0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
bbc0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
bbd0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
bbe0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
bbf0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
bc00: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bc10: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
bc20: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
bc30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
bc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
bc50: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
bc60: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
bc70: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
bc80: 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61  t *pDup, int fla
bc90: 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gs){.  Select *p
bca0: 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  Ret = 0;.  Selec
bcb0: 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t *pNext = 0;.  
bcc0: 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70  Select **pp = &p
bcd0: 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  Ret;.  Select *p
bce0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
bcf0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  =0 );.  for(p=pD
bd00: 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69  up; p; p=p->pPri
bd10: 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
bd20: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
bd30: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bd40: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
bd50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
bd60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77   break;.    pNew
bd70: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
bd80: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
bd90: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
bda0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bdb0: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
bdc0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
bdd0: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Src, flags);.   
bde0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
bdf0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
be00: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
be10: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
be20: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
be30: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
be40: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
be50: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
be60: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
be70: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
be80: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
be90: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ;.    pNew->pOrd
bea0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
beb0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
bec0: 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73  >pOrderBy, flags
bed0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
bee0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65  = p->op;.    pNe
bef0: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74  w->pNext = pNext
bf00: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69  ;.    pNew->pPri
bf10: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  or = 0;.    pNew
bf20: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
bf30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
bf40: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
bf50: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  .    pNew->pOffs
bf60: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
bf70: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
bf80: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  et, flags);.    
bf90: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
bfa0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66  ;.    pNew->iOff
bfb0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
bfc0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
bfd0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
bfe0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
bff0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
c000: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
c010: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
c020: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
c030: 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74     pNew->nSelect
c040: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
c050: 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Row;.    pNew->p
c060: 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64  With = withDup(d
c070: 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20  b, p->pWith);.  
c080: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
c090: 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e  etName(pNew, p->
c0a0: 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 2a  zSelName);.    *
c0b0: 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  pp = pNew;.    p
c0c0: 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f  p = &pNew->pPrio
c0d0: 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  r;.    pNext = p
c0e0: 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  New;.  }..  retu
c0f0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
c100: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
c110: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
c120: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
c130: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
c140: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
c150: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
c160: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
c170: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
c180: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
c190: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
c1a0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
c1b0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
c1c0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
c1d0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
c1e0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
c1f0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c200: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
c210: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
c220: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
c230: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
c240: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
c250: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
c260: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
c270: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
c280: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
c290: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
c2a0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
c2b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c2c0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
c2d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c2e0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c2f0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
c300: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
c310: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
c320: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
c330: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
c340: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
c350: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c360: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
c370: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
c380: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
c390: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c3a0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
c3b0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
c3c0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
c3d0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
c3e0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c3f0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
c400: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c410: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c420: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c430: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
c440: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
c450: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c460: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c470: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c480: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
c490: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
c4a0: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
c4b0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
c4c0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
c4d0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
c4e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c4f0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
c500: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c510: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
c520: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c530: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
c540: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
c550: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c560: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
c570: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c580: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c590: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c5b0: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
c5c0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
c5d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c5e0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c5f0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c600: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
c610: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
c620: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
c630: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
c640: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c650: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c660: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c670: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c680: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c690: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c6a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c6b0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c6c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c6d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c6e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c6f0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c700: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c710: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c720: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c730: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c740: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c750: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c760: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c770: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c780: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c790: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c7a0: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c7b0: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c7c0: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c7d0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c7e0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c7f0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c800: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c810: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c820: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c830: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52  ubquery on the R
c840: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c850: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c860: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c870: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c880: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c890: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c8a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c8b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c8c0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c8d0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c8e0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c8f0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c900: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c910: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c920: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c930: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c940: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c950: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c970: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c980: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c990: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c9a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c9b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c9c0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c9d0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c9e0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c9f0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
ca00: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
ca10: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
ca20: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
ca30: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
ca40: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
ca50: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
ca60: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
ca70: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
ca80: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
ca90: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
caa0: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
cab0: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
cac0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
cad0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
cae0: 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74  S is a vector, t
caf0: 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64  hen we can immed
cb00: 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20  iately check to 
cb10: 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74  see that .  ** t
cb20: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52  he size of the R
cb30: 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68  HS and LHS match
cb40: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48  .  But if the RH
cb50: 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a  S is a SELECT, .
cb60: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28    ** wildcards (
cb70: 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75  "*") in the resu
cb80: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
cb90: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70  LECT must be exp
cba0: 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a  anded before.  *
cbb0: 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20  * we can do the 
cbc0: 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64  size check, so d
cbd0: 65 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68  efer the size ch
cbe0: 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  eck until code g
cbf0: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  eneration..  */.
cc00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
cc10: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43  =TK_SELECT && pC
cc20: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d  olumns->nId!=(n=
cc30: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
cc40: 72 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b  rSize(pExpr)) ){
cc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cc60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
cc70: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
cc80: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
ccb0: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
ccc0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
ccd0: 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  r;.  }..  for(i=
cce0: 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  0; i<pColumns->n
ccf0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  Id; i++){.    Ex
cd00: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
cd10: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
cd20: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
cd30: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
cd40: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
cd50: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
cd60: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
cd70: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
cd80: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
cd90: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
cda0: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
cdb0: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
cdc0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
cdd0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
cde0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
cdf0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
ce00: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
ce10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
ce20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
ce30: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28  ELECT ){.    if(
ce40: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
ce50: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
ce60: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
ce70: 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e  pFirst = pList->
ce80: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b  a[iFirst].pExpr;
ce90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cea0: 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  First->op==TK_SE
ceb0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  LECT_COLUMN );. 
cec0: 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 74      .      /* St
ced0: 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ore the SELECT s
cee0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69 67  tatement in pRig
cef0: 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62 65  ht so it will be
cf00: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20 20   deleted when.  
cf10: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
cf20: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69  prListDelete() i
cf30: 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  s called */.    
cf40: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
cf50: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
cf60: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
cf70: 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
cf80: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48  e size of the LH
cf90: 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74  S in iTable so t
cfa0: 68 61 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b  hat we can check
cfb0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
cfc0: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73  he RHS and LHS s
cfd0: 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e  izes match durin
cfe0: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
cff0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 72  n. */.      pFir
d000: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
d010: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 20 20  lumns->nId;.    
d020: 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70  }.  }..vector_ap
d030: 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71  pend_error:.  sq
d040: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d050: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
d060: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
d070: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b  e(db, pColumns);
d080: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d0a0: 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  e sort order for
d0b0: 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
d0c0: 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45  t on the given E
d0d0: 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  xprList..*/.void
d0e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d0f0: 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70  SetSortOrder(Exp
d100: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53  rList *p, int iS
d110: 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28  ortOrder){.  if(
d120: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
d130: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
d140: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
d150: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
d160: 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  >=0 && SQLITE_SO
d170: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
d180: 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20  ert( p->nExpr>0 
d190: 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72  );.  if( iSortOr
d1a0: 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73  der<0 ){.    ass
d1b0: 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78  ert( p->a[p->nEx
d1c0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d  pr-1].sortOrder=
d1d0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
d1e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
d1f0: 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  }.  p->a[p->nExp
d200: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
d210: 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b   (u8)iSortOrder;
d220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d230: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
d240: 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Name element of 
d250: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
d260: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
d270: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
d280: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
d290: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
d2a0: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
d2b0: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
d2c0: 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  Name should neve
d2d0: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
d2e0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
d2f0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
d300: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
d310: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
d320: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
d330: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d340: 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  tSetName(.  Pars
d350: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d360: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d370: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d380: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d390: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
d3a0: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
d3b0: 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  span. */.  Token
d3c0: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
d3d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65     /* Name to be
d3e0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
d3f0: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
d400: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
d410: 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  ause the name to
d420: 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a   be dequoted */.
d430: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  ){.  assert( pLi
d440: 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  st!=0 || pParse-
d450: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
d460: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
d470: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
d480: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d490: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
d4a0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
d4b0: 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
d4c0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d4d0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
d4e0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
d4f0: 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  zName==0 );.    
d500: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
d510: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
d520: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
d530: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
d540: 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65  .    if( dequote
d550: 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74   ) sqlite3Dequot
d560: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
d570: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
d580: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
d590: 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74  [].zSpan element
d5a0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
d5b0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
d5c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
d5d0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
d5e0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
d5f0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
d600: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
d610: 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20  ut pSpan should 
d620: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
d630: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
d640: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
d650: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
d660: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
d670: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
d680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d690: 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20  rListSetSpan(.  
d6a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d6b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d6c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d6d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
d6f0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
d700: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45  the span. */.  E
d710: 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20  xprSpan *pSpan  
d720: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
d730: 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  an to be added *
d740: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d750: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d760: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
d770: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
d780: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
d790: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d7a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d7b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
d7c0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
d7d0: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
d7e0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d7f0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  pr>0 );.    asse
d800: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
d810: 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70  iled || pItem->p
d820: 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78  Expr==pSpan->pEx
d830: 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr );.    sqlite
d840: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
d850: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
d860: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
d870: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
d880: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
d890: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
d8c0: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
d8d0: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
d8e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
d8f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d900: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
d910: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
d920: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
d930: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
d940: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
d950: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
d960: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
d970: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
d980: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
d990: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
d9a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
d9b0: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
d9c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
d9d0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d9e0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
d9f0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
da00: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
da10: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
da20: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
da30: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
da40: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
da50: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
da60: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
da70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
da80: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
da90: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
daa0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bject);.  }.}../
dab0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
dac0: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
dad0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
dae0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
daf0: 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65   void exprListDe
db00: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
db10: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
db20: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
db30: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
db40: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
db50: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
db60: 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  !=0 || pList->nE
db70: 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  xpr==0 );.  for(
db80: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
db90: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
dba0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
dbb0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
dbc0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
dbd0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
dbe0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dbf0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
dc00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dc10: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
dc20: 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Span);.  }.  sql
dc30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dc40: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
dc50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
dc60: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
dc70: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
dc80: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
dc90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
dca0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
dcb0: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
dcc0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
dcd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
dce0: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
dcf0: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
dd00: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
dd10: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
dd20: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
dd30: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
dd40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
dd50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
dd60: 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  2 m = 0;.  if( p
dd70: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
dd80: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
dd90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
dda0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
ddb0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
ddc0: 72 3b 0a 20 20 20 20 20 20 20 61 73 73 65 72 74  r;.       assert
ddd0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
dde0: 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d       m |= pExpr-
ddf0: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
de00: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
de10: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
de20: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
de30: 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20   callbacks used 
de40: 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  to check express
de50: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69  ions to.** see i
de60: 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73  f they are "cons
de70: 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64  tant" for some d
de80: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e  efinition of con
de90: 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57  stant.  The.** W
dea0: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
deb0: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
dec0: 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61   type of "consta
ded0: 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  nt" we are looki
dee0: 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  ng.** for..**.**
def0: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
df00: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
df10: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
df20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
df30: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
df40: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
df70: 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =1.**     sqlite
df80: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
df90: 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20  otJoin()        
dfa0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
dfb0: 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==2.**     sqli
dfc0: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
dfd0: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
dfe0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
dff0: 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71  ode==3.**     sq
e000: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e010: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
e020: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e030: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a  eCode==4 or 5.**
e040: 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  .** In all cases
e050: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20  , the callbacks 
e060: 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  set Walker.eCode
e070: 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  =0 and abort if 
e080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
e090: 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f  * is found to no
e0a0: 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t be a constant.
e0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
e0c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e0d0: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  OrFunction() is 
e0e0: 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  used for evaluat
e0f0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
e100: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
e110: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
e120: 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64   The Walker.eCod
e130: 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65  e value is 5 whe
e140: 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20  n parsing.** an 
e150: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20  existing schema 
e160: 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65  and 4 when proce
e170: 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74  ssing a new stat
e180: 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a  ement.  A bound.
e190: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69  ** parameter rai
e1a0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ses an error for
e1b0: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c   new statements,
e1c0: 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79   but is silently
e1d0: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
e1e0: 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69   NULL for existi
e1f0: 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69  ng schemas.  Thi
e200: 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f  s allows sqlite_
e210: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68  master tables th
e220: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  at .** contain a
e230: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
e240: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65   because they we
e250: 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  re generated by 
e260: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  older versions.*
e270: 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62  * of SQLite to b
e280: 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65  e parsed by newe
e290: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
e2a0: 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69  Lite without rai
e2b0: 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72  sing a.** malfor
e2c0: 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72  med schema error
e2d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e2e0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
e2f0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
e300: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
e310: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
e320: 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74  er->eCode is 2 t
e330: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
e340: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
e350: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
e360: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
e370: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
e380: 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75   left join disqu
e390: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
e3a0: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
e3b0: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
e3c0: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
e3d0: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
e3e0: 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61  ode==2 && ExprHa
e3f0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
e400: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
e410: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
e420: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
e430: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e440: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
e450: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
e460: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
e470: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
e480: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
e490: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
e4a0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
e4b0: 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65  nd either pWalke
e4c0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
e4d0: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
e4e0: 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
e4f0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
e500: 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  T flag. */.    c
e510: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
e520: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
e530: 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20  er->eCode>=4 || 
e540: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e550: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
e560: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
e570: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
e580: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
e590: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
e5a0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
e5b0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e5c0: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
e5d0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
e5e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
e5f0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
e600: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
e610: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
e620: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
e630: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e640: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
e650: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e660: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
e670: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e680: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
e690: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
e6a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e6b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
e6c0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
e6d0: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
e6e0: 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d  ode==3 && pExpr-
e6f0: 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
e700: 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20  ->u.iCur ){.    
e710: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e720: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
e730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
e740: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e750: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e760: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e770: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e780: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
e790: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
e7a0: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
e7b0: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
e7c0: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
e7d0: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
e7e0: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
e7f0: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
e800: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
e810: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
e820: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
e830: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
e840: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
e850: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e860: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
e870: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
e880: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
e890: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
e8a0: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
e8b0: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
e8c0: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
e8d0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
e8e0: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
e8f0: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
e900: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
e910: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
e920: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
e930: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e940: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e950: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
e960: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
e970: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
e980: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
e990: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e9a0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
e9b0: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
e9c0: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
e9d0: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65  llow */.      te
e9e0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e9f0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
ea00: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
ea10: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
ea20: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  allow */.      r
ea30: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
ea40: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
ea50: 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49   int selectNodeI
ea60: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
ea70: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
ea80: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
ea90: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
eaa0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
eab0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
eac0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
ead0: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
eae0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
eaf0: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
eb00: 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  ag, int iCur){. 
eb10: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
eb20: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
eb30: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
eb40: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
eb50: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
eb60: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
eb70: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
eb80: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
eb90: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
eba0: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
ebb0: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
ebc0: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
ebd0: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
ebe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
ebf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
ec00: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
ec10: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
ec20: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
ec30: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
ec40: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
ec50: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
ec60: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
ec70: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
ec80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
ec90: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
eca0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
ecb0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
ecc0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
ecd0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
ece0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
ecf0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
ed00: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
ed10: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
ed20: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
ed30: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
ed40: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
ed50: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
ed60: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
ed70: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ed80: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
ed90: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
eda0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
edb0: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
edc0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
edd0: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
ede0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
edf0: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
ee00: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
ee10: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
ee20: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
ee30: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
ee40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ee50: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
ee60: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
ee70: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
ee80: 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 2, 0);.}../
ee90: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
eea0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
eeb0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
eec0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
eed0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
eee0: 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72  for any single r
eef0: 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ow of the table 
ef00: 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
ef10: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
ef20: 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  s, the.** expres
ef30: 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65  sion must not re
ef40: 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64  fer to any non-d
ef50: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
ef60: 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a  ction nor any.**
ef70: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
ef80: 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73  n iCur..*/.int s
ef90: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
efa0: 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  eConstant(Expr *
efb0: 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  p, int iCur){.  
efc0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
efd0: 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a  st(p, 3, iCur);.
efe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
eff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f000: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f010: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f020: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f030: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
f040: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
f050: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
f060: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
f070: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
f080: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
f090: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
f0a0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
f0b0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
f0c0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
f0d0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
f0e0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
f0f0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
f100: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
f110: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
f120: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
f130: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f140: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f150: 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
f160: 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
f170: 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
f180: 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
f190: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
f1a0: 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
f1b0: 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
f1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
f1d0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
f1e0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
f1f0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
f200: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
f210: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
f220: 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
f230: 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
f240: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
f250: 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
f260: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f270: 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
f280: 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
f290: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
f2a0: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
f2b0: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
f2c0: 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
f2d0: 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
f2e0: 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
f2f0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
f300: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
f310: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
f320: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
f330: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
f340: 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
f350: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
f360: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
f370: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
f380: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
f390: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
f3a0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
f3b0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
f3c0: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
f3d0: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
f3e0: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
f3f0: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
f400: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
f410: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
f420: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
f430: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
f440: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
f450: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
f460: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
f470: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
f480: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
f490: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
f4a0: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
f4b0: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  c = 0;..  /* If 
f4c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
f4d0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
f4e0: 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
f4f0: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
f500: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
f510: 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
f520: 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
f530: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
f540: 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
f550: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
f560: 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
f570: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
f580: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
f590: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
f5a0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
f5b0: 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
f5c0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
f5d0: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
f5e0: 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
f5f0: 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
f600: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
f610: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
f620: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
f630: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f640: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f650: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
f660: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f670: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f680: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
f690: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
f6a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f6b0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
f6c0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
f6d0: 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
f6e0: 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
f6f0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
f700: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
f710: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
f720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f730: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
f740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
f750: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
f760: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
f770: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
f780: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
f790: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
f7a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
f7b0: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
f7c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
f7d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
f7e0: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
f7f0: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
f800: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
f810: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
f820: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
f830: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
f840: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
f850: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
f860: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
f870: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
f880: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
f890: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
f8a0: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
f8b0: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
f8c0: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
f8d0: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
f8e0: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
f8f0: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
f900: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
f910: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
f920: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
f930: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
f940: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
f950: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
f960: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
f970: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
f980: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
f990: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
f9a0: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
f9b0: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
f9c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
f9d0: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
f9e0: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
f9f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
fa00: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
fa10: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
fa20: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
fa30: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
fa40: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
fa50: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
fa60: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
fa70: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
fa80: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
fa90: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
faa0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
fab0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
fac0: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
fad0: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
fae0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73  OLUMN:.      ass
faf0: 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20  ert( p->pTab!=0 
fb00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fb10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fb20: 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
fb30: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
fb40: 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
fb50: 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
fb60: 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
fb70: 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
fb80: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
fb90: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
fba0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
fbb0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
fbc0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
fbd0: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
fbe0: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
fbf0: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
fc00: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
fc10: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
fc20: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
fc30: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
fc40: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
fc50: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
fc60: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
fc70: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
fc80: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
fc90: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
fca0: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
fcb0: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
fcc0: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
fcd0: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
fce0: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
fcf0: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
fd00: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
fd10: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
fd20: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
fd30: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
fd40: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
fd50: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
fd60: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
fd70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
fd80: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
fd90: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
fda0: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
fdb0: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
fdc0: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
fdd0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
fde0: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
fdf0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
fe00: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
fe10: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
fe20: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
fe30: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
fe40: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
fe50: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
fe60: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
fe70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
fe80: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
fe90: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
fea0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
feb0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fec0: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
fed0: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
fee0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
fef0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ff00: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
ff10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
ff20: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
ff30: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
ff40: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
ff50: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
ff60: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
ff70: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
ff80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
ff90: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
ffa0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
ffb0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
ffc0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ffd0: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
ffe0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
fff0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
10000 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
10010 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10020 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
10030 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
10040 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
10050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
10060 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
10070 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
10080 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
10090 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
100a0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
100b0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
100c0 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
100d0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
100e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
100f0 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
10100 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
10110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
10120 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
10130 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
10140 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
10150 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
10160 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
10170 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
10180 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
10190 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
101a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
101b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
101c0 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
101d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
101e0 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
101f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
10200 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
10210 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
10220 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
10230 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
10240 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
10250 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10260 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
10270 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
10280 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
10290 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
102a0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
102b0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
102c0 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
102d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
102e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
102f0 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
10300 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
10310 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
10320 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
10330 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
10340 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
10350 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
10360 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
10370 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
10380 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
10390 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
103a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
103b0 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
103c0 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
103d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
103e0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
103f0 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
10400 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
10410 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
10420 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
10430 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
10440 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
10450 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
10460 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
10470 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
10480 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
10490 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
104a0 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
104b0 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
104c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
104d0 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
104e0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
104f0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
10500 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
10510 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
10520 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
10530 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10540 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
10550 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
10560 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
10570 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
10580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
10590 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
105a0 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
105b0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
105c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
105d0 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
105e0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
105f0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
10600 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
10610 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
10620 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
10630 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
10640 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
10650 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
10660 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
10670 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
10680 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
10690 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
106a0 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
106b0 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
106c0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Tab;.  assert( p
106d0 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
106e0 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
106f0 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
10700 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
10710 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
10720 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
10730 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
10740 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
10750 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
10760 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
10770 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
10780 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
10790 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
107a0 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72   /* All SELECT r
107b0 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63  esults must be c
107c0 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72  olumns. */.  for
107d0 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
107e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
107f0 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45   Expr *pRes = pE
10800 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10810 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  ;.    if( pRes->
10820 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
10830 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73  return 0;.    as
10840 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62  sert( pRes->iTab
10850 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  le==pSrc->a[0].i
10860 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f  Cursor );  /* No
10870 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
10880 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
10890 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e   return p;.}.#en
108a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
108b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
108c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
108d0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
108e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
108f0 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65   that checks the
10900 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
10910 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65  n of index table
10920 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a   iCur to see if.
10930 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  ** it contains a
10940 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e  ny NULL entries.
10950 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69    Cause the regi
10960 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75  ster at regHasNu
10970 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20  ll to be set.** 
10980 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  to a non-NULL va
10990 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74  lue if iCur cont
109a0 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20  ains no NULLs.  
109b0 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72  Cause register r
109c0 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  egHasNull.** to 
109d0 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  be set to NULL i
109e0 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
109f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
10a00 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
10a10 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
10a20 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64  etHasNullFlag(Vd
10a30 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c  be *v, int iCur,
10a40 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29   int regHasNull)
10a50 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20  {.  int addr1;. 
10a60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a70 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10a80 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
10a90 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
10aa0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10ab0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
10ac0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10ad0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
10ae0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
10af0 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72  lumn, iCur, 0, r
10b00 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71  egHasNull);.  sq
10b10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10b20 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45  5(v, OPFLAG_TYPE
10b30 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f  OFARG);.  VdbeCo
10b40 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74  mment((v, "first
10b50 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20  _entry_in(%d)", 
10b60 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  iCur));.  sqlite
10b70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10b80 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69   addr1);.}.#endi
10b90 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
10ba0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10bb0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
10bc0 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ent is an IN ope
10bd0 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73  rator with a lis
10be0 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
10bf0 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69  y) on the .** ri
10c00 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20  ght-hand side.  
10c10 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10c20 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73  hat list is cons
10c30 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tant..*/.static 
10c40 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73  int sqlite3InRhs
10c50 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
10c60 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  *pIn){.  Expr *p
10c70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  LHS;.  int res;.
10c80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
10c90 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20  asProperty(pIn, 
10ca0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
10cb0 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70  .  pLHS = pIn->p
10cc0 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  Left;.  pIn->pLe
10cd0 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20  ft = 0;.  res = 
10ce0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
10cf0 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49  stant(pIn);.  pI
10d00 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b  n->pLeft = pLHS;
10d10 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
10d20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10d40 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
10d50 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
10d60 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
10d70 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70  tor..** The pX p
10d80 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
10d90 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68  expression on th
10da0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
10db0 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a  operator, which.
10dc0 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  ** might be eith
10dd0 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  er a list of exp
10de0 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
10df0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
10e00 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
10e10 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64  utine is to find
10e20 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
10e30 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
10e40 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65  can.** be used e
10e50 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
10e60 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20  r membership in 
10e70 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74  the RHS set or t
10e80 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
10e90 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73  h.** all members
10ea0 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c   of the RHS set,
10eb0 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
10ec0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75  ates..**.** A cu
10ed0 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  rsor is opened o
10ee0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  n the b-tree obj
10ef0 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20  ect that is the 
10f00 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
10f10 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58  erator.** and pX
10f20 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  ->iTable is set 
10f30 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
10f40 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  that cursor..**.
10f50 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
10f60 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
10f70 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
10f80 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
10f90 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
10fa0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
10fb0 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20  OWID      - The 
10fc0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
10fd0 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
10fe0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
10ff0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20  NDEX_INDEX_ASC  
11000 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
11010 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73   opened on an as
11020 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
11030 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
11040 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75  EX_DESC - The cu
11050 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
11060 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
11070 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
11080 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20  NDEX_EPH        
11090 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
110a0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
110b0 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
110c0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
110e0 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
110f0 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  l table..**   IN
11100 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20  _INDEX_NOOP     
11110 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61    - No cursor wa
11120 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68  s allocated.  Th
11130 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  e IN operator mu
11140 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  st be.**        
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
11170 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  a sequence of co
11180 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  mparisons..**.**
11190 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
111a0 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65  ree might be use
111b0 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70  d if the RHS exp
111c0 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20  ression pX is a 
111d0 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65  simple.** subque
111e0 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a  ry such as:.**.*
111f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
11200 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32  lumn1>, <column2
11210 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  >... FROM <table
11220 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
11230 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
11240 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
11250 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
11260 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
11270 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
11280 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
11290 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
112a0 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
112b0 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
112c0 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
112d0 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
112e0 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
112f0 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
11300 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
11310 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
11320 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
11330 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  tain exactly one
11340 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20   of the bits.** 
11350 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
11360 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f  HIP or IN_INDEX_
11370 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67  LOOP.  If inFlag
11380 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e  s contains.** IN
11390 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
113a0 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65  P, then the gene
113b0 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c  rated table will
113c0 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a   be used for a.*
113d0 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69  * fast membershi
113e0 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68  p test.  When th
113f0 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  e IN_INDEX_LOOP 
11400 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a  bit is set, the.
11410 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  ** IN index will
11420 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70   be used to loop
11430 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
11440 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   of the RHS of t
11450 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  he.** IN operato
11460 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
11470 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
11480 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
11490 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
114a0 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
114b0 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
114c0 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
114d0 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
114e0 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
114f0 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
11500 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
11510 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
11520 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
11530 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  mns are guarante
11540 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
11550 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
11560 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
11570 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11580 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20   or due to.** a 
11590 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
115a0 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  t or index..**.*
115b0 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
115c0 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
115d0 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
115e0 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
115f0 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
11600 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
11610 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
11620 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
11630 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
11640 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20  ss <columns> is 
11650 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52  a single INTEGER
11660 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
11670 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e  umn or an .** in
11680 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  dex can be found
11690 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
116a0 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73  ied <columns> as
116b0 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a   its left-most..
116c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
116d0 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
116e0 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
116f0 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
11700 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
11710 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
11720 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
11730 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
11740 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
11750 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
11760 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
11770 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
11780 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
11790 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
117a0 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
117b0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
117c0 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20  INDEX_NOOP.  In 
117d0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
117e0 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
117f0 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
11800 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
11810 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
11820 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
11830 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
11840 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
11850 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
11860 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
11870 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
11880 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
11890 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
118a0 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
118b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
118c0 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
118d0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
118e0 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
118f0 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75  .  If prRhsHasNu
11900 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c  ll is not a NULL
11910 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a   pointer and .**
11920 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
11930 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11940 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
11950 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
11960 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
11970 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
11980 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
11990 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
119a0 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
119b0 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   to *prRhsHasNul
119c0 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  l. If there is n
119d0 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
119e0 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
119f0 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
11a00 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73  , then *prRhsHas
11a10 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63  Null is left unc
11a20 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
11a30 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
11a40 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
11a50 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
11a60 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   in *prRhsHasNul
11a70 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  l, then.** the v
11a80 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67  alue in that reg
11a90 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55  ister will be NU
11aa0 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  LL if the b-tree
11ab0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
11ac0 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61   more.** NULL va
11ad0 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c  lues, and it wil
11ae0 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55  l be some non-NU
11af0 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  LL value if the 
11b00 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
11b10 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  no.** NULL value
11b20 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
11b30 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20  aiMap parameter 
11b40 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
11b50 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
11b60 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e   array containin
11b70 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  g.** one element
11b80 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
11b90 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11ba0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11bb0 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20  t on the RHS.** 
11bc0 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f  of the IN(...) o
11bd0 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74  perator. The i't
11be0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61  h entry of the a
11bf0 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65  rray is populate
11c00 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66  d with the.** of
11c10 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65  fset of the inde
11c20 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61  x column that ma
11c30 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20 63  tches the i'th c
11c40 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
11c50 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e  y the.** SELECT.
11c60 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
11c70 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11c80 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64  and selected ind
11c90 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ex are:.**.**   
11ca0 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45  (?,?,?) IN (SELE
11cb0 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
11cc0 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  t1).**   CREATE 
11cd0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
11ce0 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74  , c, a);.**.** t
11cf0 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70  hen aiMap[] is p
11d00 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32  opulated with {2
11d10 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e  , 0, 1}..*/.#ifn
11d20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11d30 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
11d40 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
11d50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11d70 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11d80 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20   */.  Expr *pX, 
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
11db0 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f 66  nd side (RHS) of
11dc0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
11dd0 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67   */.  u32 inFlag
11de0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
11df0 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   /* IN_INDEX_LOO
11e00 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  P, _MEMBERSHIP, 
11e10 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20  and/or _NOOP_OK 
11e20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48  */.  int *prRhsH
11e30 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  asNull,         
11e40 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
11e50 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e  ing NULL status.
11e60 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20    See notes */. 
11e70 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20   int *aiMap     
11e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11e90 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65  apping from Inde
11ea0 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20  x fields to RHS 
11eb0 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53  fields */.){.  S
11ec0 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
11ef0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
11f00 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
11f10 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
11f40 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
11f50 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
11f60 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
11f70 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
11f80 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
11f90 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
11fa0 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
11fb0 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
11fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11fd0 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
11fe0 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
11ff0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
12000 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
12010 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
12020 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
12030 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
12040 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
12050 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
12060 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
12070 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
12080 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
12090 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
120a0 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
120b0 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
120c0 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
120d0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
120e0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
120f0 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
12100 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
12110 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
12120 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
12130 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
12140 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
12150 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
12160 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
12170 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
12180 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
12190 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
121a0 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
121b0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
121c0 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
121d0 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
121e0 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
121f0 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
12200 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
12210 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
12220 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
12230 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
12240 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
12250 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
12260 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12270 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
12280 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
12290 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
122a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
122b0 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
122c0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
122d0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
122e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
122f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
12300 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
12310 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
12320 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
12330 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
12340 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
12350 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
12360 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
12370 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
12380 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
12390 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
123a0 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
123b0 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
123c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
123d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123f0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12400 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
12410 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
12440 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
12450 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
12480 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
12490 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
124a0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
124b0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
124c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
124d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
124e0 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
124f0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
12500 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
12510 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
12520 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12530 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
12540 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
12550 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
12560 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
12570 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12580 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
12590 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
125a0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
125b0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
125c0 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
125d0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
125e0 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
125f0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
12600 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
12610 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
12620 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
12630 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
12640 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
12650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
12660 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
12670 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
12680 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12690 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
126a0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
126b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
126c0 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
126d0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
126e0 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
126f0 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
12700 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
12710 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
12720 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
12730 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
12740 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
12750 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
12760 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
12770 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
12780 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12790 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
127a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
127b0 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
127c0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
127d0 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
127e0 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
127f0 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
12800 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
12810 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
12820 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12830 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
12840 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
12850 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
12880 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  iable */.      i
12890 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
128a0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   1;.      int i;
128b0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
128c0 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
128d0 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
128e0 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
128f0 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63  each .      ** c
12900 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
12910 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
12920 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f  inity of each co
12930 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20  lumn in table.  
12940 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48      ** on the RH
12950 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12960 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74  ator.  If it not
12970 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
12980 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ible to.      **
12990 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f   use any index o
129a0 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e  f the RHS table.
129b0 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
129c0 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61  =0; i<nExpr && a
129d0 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29  ffinity_ok; i++)
129e0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
129f0 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65  pLhs = sqlite3Ve
12a00 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
12a10 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  (pX->pLeft, i);.
12a20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
12a30 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
12a40 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
12a50 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
12a60 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62  aff = sqlite3Tab
12a70 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  leColumnAffinity
12a80 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20  (pTab,iCol); /* 
12a90 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  RHS table */.   
12aa0 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66       char cmpaff
12ab0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
12ac0 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20  eAffinity(pLhs, 
12ad0 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
12ae0 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66   testcase( cmpaf
12af0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
12b00 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  OB );.        te
12b10 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
12b20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
12b30 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  );.        switc
12b40 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20  h( cmpaff ){.   
12b50 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
12b60 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
12b70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12b80 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
12b90 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
12bb0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
12bc0 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74  inity() only ret
12bd0 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65  urns TEXT if one
12be0 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
12bf0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65           ** othe
12c00 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74  r has no affinit
12c10 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  y and the other 
12c20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48  side is TEXT.  H
12c30 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ence,.          
12c40 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61    ** the only wa
12c50 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20  y for cmpaff to 
12c60 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69  be TEXT is for i
12c70 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54  dxaff to be TEXT
12c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
12c90 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d  and for the term
12ca0 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
12cb0 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f  he IN to have no
12cc0 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
12cd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
12ce0 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45  ( idxaff==SQLITE
12cf0 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
12d00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12d10 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
12d20 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  t:.            a
12d30 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
12d40 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
12d50 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20  inity(idxaff);. 
12d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12d70 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69  ..      if( affi
12d80 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20  nity_ok ){.     
12d90 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
12da0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64   an existing ind
12db0 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72  ex that will wor
12dc0 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70  k for this IN op
12dd0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
12de0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
12df0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
12e00 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d   eType==0; pIdx=
12e10 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
12e20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
12e30 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a  colUsed;      /*
12e40 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   Columns of the 
12e50 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20  index used */.  
12e60 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
12e70 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  mCol;         /*
12e80 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75   Mask for the cu
12e90 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  rrent column */.
12ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12eb0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70  dx->nColumn<nExp
12ec0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
12ed0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
12ee0 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d  um nColumn is BM
12ef0 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20  S-2, not BMS-1, 
12f00 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
12f10 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20  ompute.         
12f20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70   ** BITMASK(nExp
12f30 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66  r) without overf
12f40 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  lowing */.      
12f50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
12f60 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53  dx->nColumn==BMS
12f70 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -2 );.          
12f80 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
12f90 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29  nColumn==BMS-1 )
12fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12fb0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42  pIdx->nColumn>=B
12fc0 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  MS-1 ) continue;
12fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
12fe0 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20  ustBeUnique ){. 
12ff0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13000 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78  Idx->nKeyCol>nEx
13010 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pr.             
13020 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ||(pIdx->nColumn
13030 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69  >nExpr && !IsUni
13040 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a  queIndex(pIdx)).
13050 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
13070 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20  tinue;  /* This 
13080 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69  index is not uni
13090 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20  que over the IN 
130a0 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  RHS columns */. 
130b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
130c0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
130d0 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20        colUsed = 
130e0 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  0;   /* Columns 
130f0 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f  of index used so
13100 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
13110 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
13120 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
13130 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
13140 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
13150 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
13160 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
13170 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
13180 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  hs = pEList->a[i
13190 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
131a0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
131b0 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
131c0 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
131d0 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
131e0 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Rhs);.          
131f0 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20    int j;.  .    
13200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13210 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d  pReq!=0 || pRhs-
13220 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57  >iColumn==XN_ROW
13230 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ID || pParse->nE
13240 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
13250 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78    for(j=0; j<nEx
13260 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
13270 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
13280 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70  ->aiColumn[j]!=p
13290 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63  Rhs->iColumn ) c
132a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
132b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
132c0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29  Idx->azColl[j] )
132d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
132e0 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73  if( pReq!=0 && s
132f0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
13300 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
13310 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
13320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13330 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
13340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13350 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
13360 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
13370 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
13380 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b  ==nExpr ) break;
13390 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f  .            mCo
133a0 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a  l = MASKBIT(j);.
133b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
133c0 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29  mCol & colUsed )
133d0 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20   break; /* Each 
133e0 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79  column used only
133f0 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20   once */.       
13400 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
13410 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  mCol;.          
13420 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
13430 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
13440 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
13450 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
13460 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64  nExpr || colUsed
13470 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  !=(MASKBIT(nExpr
13480 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  )-1) );.        
13490 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28    if( colUsed==(
134a0 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
134b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
134c0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
134d0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
134e0 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78   means the index
134f0 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20   pIdx is usable 
13500 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
13510 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
13520 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
13530 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
13540 76 65 72 61 67 65 28 76 29 3b 0a 23 69 66 6e 64  verage(v);.#ifnd
13550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
13560 58 50 4c 41 49 4e 0a 20 20 20 20 20 20 20 20 20  XPLAIN.         
13570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13580 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
13590 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20  in, 0, 0, 0,.   
135a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
135b0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 55  e3MPrintf(db, "U
135c0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
135d0 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
135e0 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  Idx->zName),.   
135f0 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 44 59             P4_DY
13600 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20  NAMIC);.#endif. 
13610 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13620 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13630 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
13640 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
13650 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
13660 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
13670 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
13680 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
13690 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
136a0 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
136b0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
136c0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f       assert( IN_
136d0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
136e0 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44   == IN_INDEX_IND
136f0 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20  EX_ASC+1 );.    
13700 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
13710 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
13720 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
13730 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20  Order[0];.  .   
13740 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52           if( prR
13750 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66  hsHasNull ){.#if
13760 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
13770 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
13780 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  SK.             
13790 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c   i64 mask = (1<<
137a0 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20  nExpr)-1;.      
137b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
137c0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
137d0 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
137e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
137f0 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20      iTab, 0, 0, 
13800 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49  (u8*)&mask, P4_I
13810 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
13820 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52              *prR
13830 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50  hsHasNull = ++pP
13840 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
13850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45            if( nE
13860 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
13870 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13880 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
13890 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48  v, iTab, *prRhsH
138a0 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  asNull);.       
138b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
138c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
138d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
138e0 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
138f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13900 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
13910 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73  oop over indexes
13920 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45   */.      } /* E
13930 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f  nd if( affinity_
13940 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a  ok ) */.    } /*
13950 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72   End if not an r
13960 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  owid index */.  
13970 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74  } /* End attempt
13980 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69   to optimize usi
13990 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a  ng an index */..
139a0 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78    /* If no preex
139b0 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  isting index is 
139c0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
139d0 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a  e IN clause.  **
139e0 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   and IN_INDEX_NO
139f0 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64  OP is an allowed
13a00 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20   reply.  ** and 
13a10 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13a20 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
13a30 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71  list, not a subq
13a40 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  uery.  ** and th
13a50 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e RHS is not con
13a60 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f  stant or has two
13a70 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c   or fewer terms,
13a80 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
13a90 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74   not worth creat
13aa0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
13ab0 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61   table to evalua
13ac0 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f  te.  ** the IN o
13ad0 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72  perator so retur
13ae0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
13af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
13b00 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c  e==0.   && (inFl
13b10 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e  ags & IN_INDEX_N
13b20 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45  OOP_OK).   && !E
13b30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13b40 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
13b50 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33  .   && (!sqlite3
13b60 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
13b70 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69  pX) || pX->x.pLi
13b80 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20  st->nExpr<=2).  
13b90 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  ){.    eType = I
13ba0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20  N_INDEX_NOOP;.  
13bb0 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
13bc0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c  0 ){.    /* Coul
13bd0 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78  d not find an ex
13be0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
13bf0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
13c00 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
13c10 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
13c20 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
13c30 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
13c40 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
13c50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
13c60 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
13c70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
13c80 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
13c90 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
13ca0 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
13cb0 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
13cc0 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  f( inFlags & IN_
13cd0 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20  INDEX_LOOP ){.  
13ce0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
13cf0 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  ryLoop = 0;.    
13d00 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d    if( pX->pLeft-
13d10 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
13d20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13d30 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
13d40 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70   ){.        eTyp
13d50 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
13d60 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
13d70 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48  }else if( prRhsH
13d80 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  asNull ){.      
13d90 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
13da0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
13db0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13dc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13dd0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
13de0 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
13df0 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
13e00 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
13e10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
13e20 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
13e30 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73  ueryLoop;.  }els
13e40 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
13e50 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20  e = iTab;.  }.. 
13e60 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54   if( aiMap && eT
13e70 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
13e80 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65  DEX_ASC && eType
13e90 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
13ea0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74  _DESC ){.    int
13eb0 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73   i, n;.    n = s
13ec0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
13ed0 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b  Size(pX->pLeft);
13ee0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13ef0 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d  n; i++) aiMap[i]
13f00 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = i;.  }.  retu
13f10 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
13f20 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
13f30 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13f40 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
13f50 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20  pExpr is an (?, 
13f60 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78  ?...) IN(...) ex
13f70 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a  pression. This .
13f80 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
13f90 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
13fa0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
13fb0 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
13fc0 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66  ning .** the aff
13fd0 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73  inities to be us
13fe0 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ed for each colu
13ff0 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  mn of the compar
14000 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ison..**.** It i
14010 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14020 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
14030 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  er to ensure tha
14040 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  t the returned.*
14050 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e  * string is even
14060 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
14070 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
14080 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
14090 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69  ar *exprINAffini
140a0 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
140b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
140c0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
140d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
140e0 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
140f0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
14100 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63  (pLeft);.  Selec
14110 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45  t *pSelect = (pE
14120 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
14130 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78  xIsSelect) ? pEx
14140 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pr->x.pSelect : 
14150 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
14160 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
14170 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
14180 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
14190 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
141a0 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29  rse->db, nVal+1)
141b0 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
141c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
141d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
141e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
141f0 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65   *pA = sqlite3Ve
14200 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
14210 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
14220 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74    char a = sqlit
14230 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
14240 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  A);.      if( pS
14250 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
14260 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74   zRet[i] = sqlit
14270 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14280 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  y(pSelect->pELis
14290 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
142a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
142b0 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
142c0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
142d0 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c   }.    zRet[nVal
142e0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
142f0 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
14300 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
14310 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
14320 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  ERY./*.** Load t
14330 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
14340 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
14350 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rst argument wit
14360 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  h an error .** m
14370 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
14380 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
14390 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
143a0 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
143b0 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f  cted M".*/   .vo
143c0 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c  id sqlite3Subsel
143d0 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a  ectError(Parse *
143e0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74  pParse, int nAct
143f0 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74  ual, int nExpect
14400 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
14410 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c  *zFmt = "sub-sel
14420 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63  ect returns %d c
14430 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
14440 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33  d %d";.  sqlite3
14450 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14460 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20   zFmt, nActual, 
14470 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64  nExpect);.}.#end
14480 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
14490 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
144a0 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20  vector that has 
144b0 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63  been used in a c
144c0 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20  ontext where.** 
144d0 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  it is not permit
144e0 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73  ted. If pExpr is
144f0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65   a sub-select ve
14500 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ctor, this routi
14510 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65  ne .** loads the
14520 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69   Parse object wi
14530 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20  th a message of 
14540 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
14550 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
14560 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
14570 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a  - expected 1".**
14580 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73  .** Or, if it is
14590 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61   a regular scala
145a0 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20  r vector:.**.** 
145b0 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73    "row value mis
145c0 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  used".*/   .void
145d0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
145e0 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50  rorMsg(Parse *pP
145f0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
14600 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r){.#ifndef SQLI
14610 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14620 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
14630 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
14640 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
14650 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
14660 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
14670 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
14680 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d  ->nExpr, 1);.  }
14690 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
146a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
146b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
146c0 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
146d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
146e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
146f0 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
14700 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
14710 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
14720 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
14730 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
14740 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
14750 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
14760 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
14770 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
14780 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
14790 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
147a0 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
147b0 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
147c0 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
147d0 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
147e0 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
147f0 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
14800 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
14810 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
14820 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
14830 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
14840 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
14850 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
14860 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
14870 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
14880 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
14890 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
148a0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
148b0 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
148c0 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
148d0 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
148e0 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
148f0 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
14900 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
14910 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
14920 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
14930 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
14940 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
14950 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
14960 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
14970 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
14980 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
14990 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
149a0 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
149b0 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
149c0 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
149d0 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
149e0 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
149f0 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
14a00 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
14a10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
14a20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
14a30 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
14a40 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
14a50 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
14a60 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
14a70 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
14a80 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73  LLs..** All this
14a90 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
14aa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
14ab0 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
14ac0 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a  y rMayHaveNull.*
14ad0 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  * to NULL.  Call
14ae0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
14af0 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63  l take care of c
14b00 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
14b10 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74  ister.** value t
14b20 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
14b30 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
14b40 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ee..**.** For a 
14b50 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
14b60 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
14b70 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
14b80 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
14b90 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20   result.  For a 
14ba0 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c  multi-column SEL
14bb0 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ECT, the result 
14bc0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63  is stored in a c
14bd0 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72  ontiguous.** arr
14be0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
14bf0 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 76  and the return v
14c00 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 67 69  alue is the regi
14c10 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74  ster of the left
14c20 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20  -most.** result 
14c30 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20  column.  Return 
14c40 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  0 for IN operato
14c50 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  rs or if an erro
14c60 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66  r occurs..*/.#if
14c70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14c80 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
14c90 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
14ca0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
14cb0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
14cc0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14cd0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
14ce0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
14cf0 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
14d00 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
14d10 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61  tor */.  int rHa
14d20 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20  sNullFlag,      
14d30 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
14d40 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
14d50 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
14d60 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
14d70 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
14d80 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
14d90 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
14da0 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
14db0 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e  {.  int jmpIfDyn
14dc0 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20  amic = -1;      
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
14df0 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e   address */.  in
14e00 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14e30 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74  r storing result
14e40 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ing */.  Vdbe *v
14e50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14e60 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14e70 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
14e80 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
14e90 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
14ea0 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54  pParse);..  /* T
14eb0 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  he evaluation of
14ec0 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53 2f 53   the IN/EXISTS/S
14ed0 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72 65  ELECT must be re
14ee0 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d  peated every tim
14ef0 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63  e it.  ** is enc
14f00 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20  ountered if any 
14f10 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14f20 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
14f30 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
14f40 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
14f50 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
14f60 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
14f70 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
14f80 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
14f90 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
14fa0 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
14fb0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
14fc0 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
14fd0 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
14fe0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
14ff0 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
15000 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
15010 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
15020 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
15030 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
15040 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
15050 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
15060 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
15070 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
15080 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15090 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
150a0 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69  .    jmpIfDynami
150b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  c = sqlite3VdbeA
150c0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
150d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
150e0 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  v);.  }..#ifndef
150f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
15100 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
15110 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
15120 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
15130 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
15140 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58  (pParse->db, "EX
15150 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55  ECUTE %s%s SUBQU
15160 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ERY %d",.       
15170 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
15180 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
15190 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ",.        pExpr
151a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53  ->op==TK_IN?"LIS
151b0 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20  T":"SCALAR",.   
151c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65       pParse->iNe
151d0 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29  xtSelectId.    )
151e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
151f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
15200 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
15210 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
15220 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
15230 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
15240 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
15250 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
15260 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
15270 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
15280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
15290 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
152a0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
152b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
152c0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
152d0 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
152e0 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
152f0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
15300 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15310 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
15320 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
15330 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  */.      int nVa
15340 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15350 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15360 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a  vector pLeft */.
15370 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61        .      nVa
15380 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
15390 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
153a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
153b0 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c  !isRowid || nVal
153c0 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
153d0 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
153e0 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
153f0 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
15400 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
15410 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
15420 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
15430 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
15440 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
15450 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
15460 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65  filled with inde
15470 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
15480 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
15490 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
154a0 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  ** SELECT or the
154b0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
154c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
154d0 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
154e0 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
154f0 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
15500 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
15510 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
15520 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
15530 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
15540 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
15550 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
15560 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
15570 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
15580 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
15590 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
155a0 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
155b0 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
155c0 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
155d0 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
155e0 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
155f0 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
15600 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
15610 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
15620 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
15630 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
15640 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
15650 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
15660 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
15670 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
15680 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
15690 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
156a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
156b0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
156c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
156d0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
156e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  , .          pEx
156f0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52  pr->iTable, (isR
15700 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20  owid?0:nVal));. 
15710 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
15720 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71  isRowid ? 0 : sq
15730 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
15740 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  c(pParse->db, nV
15750 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69  al, 1);..      i
15760 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
15770 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
15780 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
15790 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
157a0 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
157b0 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
157c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
157d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
157e0 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
157f0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
15800 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
15810 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
15820 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
15830 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
15840 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15850 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
15860 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
15870 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ect;.        Exp
15880 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
15890 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
158a0 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
158b0 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
158c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
158d0 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74  LHS and RHS of t
158e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64  he IN operator d
158f0 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61  o not match, tha
15900 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  t.        ** err
15910 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
15920 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
15930 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
15940 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
15950 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
15960 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
15970 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
15980 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
15990 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
159a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   i;.          sq
159b0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
159c0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
159d0 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
159e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  e);.          de
159f0 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78  st.zAffSdst = ex
15a00 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
15a10 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
15a20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
15a30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78  pExpr->iTable&0x
15a40 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72  0000FFFF)==pExpr
15a50 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
15a60 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
15a70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15a80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15a90 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
15aa0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
15ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
15ac0 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
15ad0 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
15ae0 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
15af0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
15b00 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
15b10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15b20 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
15b30 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
15b40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
15b50 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
15b60 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
15b70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15b80 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
15b90 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
15ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15bd0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
15be0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
15bf0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15c00 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
15c10 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
15c20 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
15c30 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
15c40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15c50 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
15c60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15c70 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
15c80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
15c90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
15ca0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
15cb0 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
15cc0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15cd0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
15ce0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
15cf0 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
15d00 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
15d10 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
15d20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
15d30 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
15d40 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
15d50 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20  ollSeq(.        
15d60 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
15d70 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p, pEList->a[i].
15d80 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  pExpr.          
15d90 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
15da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15db0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
15dc0 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
15dd0 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
15de0 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
15df0 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
15e00 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
15e10 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
15e20 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
15e30 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
15e40 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
15e50 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
15e60 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
15e70 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
15e80 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
15e90 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
15ea0 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
15eb0 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
15ec0 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
15ed0 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
15ee0 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
15ef0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
15f00 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
15f10 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
15f20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
15f30 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
15f40 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
15f50 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
15f60 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
15f70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15f80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
15f90 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
15fa0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
15fb0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
15fc0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
15fd0 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
15fe0 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e  ;..        affin
15ff0 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
16000 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
16010 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
16020 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
16030 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
16040 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
16050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16060 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
16070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
16080 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
16090 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
160a0 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
160b0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
160c0 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
160d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
160e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
160f0 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ft);.        }..
16100 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
16110 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
16120 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
16130 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
16140 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
16150 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16160 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
16170 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16180 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
16190 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
161a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161b0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
161c0 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f   r2);.        fo
161d0 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
161e0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
161f0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
16200 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
16210 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
16220 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
16230 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
16240 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
16250 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
16260 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
16270 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
16280 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
16290 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
162a0 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
162b0 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
162c0 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
162d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
162e0 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
162f0 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
16300 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
16310 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
16320 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
16330 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
16340 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
16350 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
16360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
16370 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26  mpIfDynamic>=0 &
16380 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
16390 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
163a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
163b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
163c0 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Noop(v, jmpIfDyn
163d0 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20  amic);.         
163e0 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
163f0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
16400 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
16410 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
16420 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
16430 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
16440 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
16450 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
16460 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  id && sqlite3Exp
16470 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
16480 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20  &iValToIns) ){. 
16490 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
164a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
164b0 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45  OP_InsertInt, pE
164c0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
164d0 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20   iValToIns);.   
164e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
164f0 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
16500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
16510 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
16520 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
16530 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
16540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16560 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
16570 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  t, r3,.         
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
165a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
165b0 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
165c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
165d0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
165e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
165f0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16600 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
16610 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
16620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16630 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16640 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16650 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
16660 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
16670 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
16680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16690 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
166a0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
166b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
166c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
166d0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
166e0 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
166f0 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c  >iTable, r2, r3,
16700 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
16710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
16720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16730 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16740 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16750 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
16760 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16770 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
16780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16790 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
167a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
167b0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
167c0 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
167d0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
167e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
167f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16800 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
16810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
16820 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
16830 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  : {.      /* Cas
16840 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20  e 3:    (SELECT 
16850 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20  ... FROM ...).  
16860 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20      **     or:  
16870 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20    EXISTS(SELECT 
16880 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20  ... FROM ...).  
16890 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
168a0 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65  For a SELECT, ge
168b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
168c0 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ut the values fo
168d0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
168e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69  .      ** the fi
168f0 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20  rst row into an 
16900 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
16910 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  rs and return th
16920 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20  e index of.     
16930 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65   ** the first re
16940 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a  gister..      **
16950 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
16960 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
16970 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72  write an integer
16980 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
16990 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20  or 1 (exists).  
169a0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65      ** into a re
169b0 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72  gister and retur
169c0 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
169d0 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a  number..      **
169e0 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74  .      ** In bot
169f0 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65  h cases, the que
16a00 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20  ry is augmented 
16a10 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20  with "LIMIT 1". 
16a20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70   Any .      ** p
16a30 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74  reexisting limit
16a40 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e   is discarded in
16a50 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65   place of the ne
16a60 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20  w LIMIT 1..     
16a70 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
16a80 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
16ab0 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
16ac0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
16ad0 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16af0 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
16b00 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a   SELECT result *
16b10 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67  /.      int nReg
16b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b40 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   Registers to al
16b50 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20  locate */..     
16b60 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
16b70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
16b80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16b90 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
16ba0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
16bb0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16bc0 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
16bd0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
16be0 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
16bf0 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
16c00 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16c10 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a  _xIsSelect) );..
16c20 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
16c30 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
16c40 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70       nReg = pExp
16c50 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
16c60 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d   ? pSel->pEList-
16c70 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20  >nExpr : 1;.    
16c80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
16c90 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
16ca0 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  , pParse->nMem+1
16cb0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
16cc0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
16cd0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
16ce0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
16cf0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
16d00 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
16d10 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73         dest.iSds
16d20 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  t = dest.iSDParm
16d30 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e  ;.        dest.n
16d40 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20  Sdst = nReg;.   
16d50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
16d70 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61  l, 0, dest.iSDPa
16d80 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  rm, dest.iSDParm
16d90 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20  +nReg-1);.      
16da0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16db0 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79  , "Init subquery
16dc0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
16dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16de0 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
16df0 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20  T_Exists;.      
16e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16e10 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16e20 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61  r, 0, dest.iSDPa
16e30 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
16e40 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
16e50 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
16e60 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
16e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
16e80 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
16e90 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a   pSel->pLimit);.
16ea0 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
16eb0 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
16ec0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
16ed0 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 0a 20 20  , TK_INTEGER,.  
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
16f10 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  s[1], 0);.      
16f20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
16f30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65  ;.      pSel->se
16f40 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75  lFlags &= ~SF_Mu
16f50 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  ltiValue;.      
16f60 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
16f70 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
16f80 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
16f90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
16fa0 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
16fb0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
16fc0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
16fd0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16fe0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
16ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17000 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
17010 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
17020 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
17030 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
17040 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
17050 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
17060 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
17070 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
17080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
17090 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
170a0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
170b0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
170c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
170d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
170e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
170f0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
17100 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17110 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49  RY./*.** Expr pI
17120 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  n is an IN(...) 
17130 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
17140 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
17150 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75   that the .** su
17160 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20  b-select on the 
17170 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
17180 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65  operator has the
17190 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
171a0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74  .** columns as t
171b0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
171c0 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65   LHS. Or, if the
171d0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
171e0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75   is not .** a su
171f0 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68  b-query, that th
17200 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f  e LHS is a vecto
17210 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a  r of size 1..*/.
17220 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
17230 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50  heckIN(Parse *pP
17240 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29  arse, Expr *pIn)
17250 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20  {.  int nVector 
17260 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
17270 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65  torSize(pIn->pLe
17280 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d  ft);.  if( (pIn-
17290 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
172a0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66  elect) ){.    if
172b0 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e  ( nVector!=pIn->
172c0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
172d0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
172e0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
172f0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
17300 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
17310 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e  pEList->nExpr, n
17320 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  Vector);.      r
17330 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
17340 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74   }else if( nVect
17350 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or!=1 ){.    sql
17360 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
17370 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  sg(pParse, pIn->
17380 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75  pLeft);.    retu
17390 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
173a0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
173b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
173c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
173d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
173e0 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
173f0 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
17400 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
17410 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
17420 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
17430 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
17440 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
17450 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
17460 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72 65 73  or vector expres
17470 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72  sion.  The .** r
17480 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
17490 52 48 53 29 20 69 73 20 61 6e 20 61 72 72 61 79  RHS) is an array
174a0 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
174b0 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20   scalar values, 
174c0 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  or a.** subquery
174d0 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
174e0 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
174f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
17500 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a  t columns must.*
17510 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  * match the numb
17520 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
17530 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
17540 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20  he LHS.  If the 
17550 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74  RHS is.** a list
17560 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20   of values, the 
17570 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 63  LHS must be a sc
17580 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  alar. .**.** The
17590 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
175a0 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
175b0 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e  value is contain
175c0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
175d0 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  S..** The result
175e0 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
175f0 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74 65   LHS is definite
17600 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48  ly not in the RH
17610 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75  S.  The .** resu
17620 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
17630 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68  e presence of th
17640 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53  e LHS in the RHS
17650 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64   cannot be .** d
17660 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f  etermined due to
17670 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   NULLs..**.** Th
17680 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
17690 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
176a0 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
176b0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
176c0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
176d0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
176e0 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
176f0 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
17700 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
17710 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
17720 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
17730 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
17740 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
17750 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
17760 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
17770 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
17780 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ough..**.** See 
17790 74 68 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d  the separate in-
177a0 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75  operator.md docu
177b0 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69  mentation file i
177c0 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a  n the canonical.
177d0 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65  ** SQLite source
177e0 20 74 72 65 65 20 66 6f 72 20 61 64 64 69 74 69   tree for additi
177f0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
17800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17810 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17820 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
17830 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
17840 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
17850 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
17860 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
17870 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
17880 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
17890 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
178a0 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
178b0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
178c0 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
178d0 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
178e0 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
178f0 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
17900 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
17910 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
17920 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
17930 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
17940 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
17950 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
17960 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
17970 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
17980 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
17990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
179a0 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
179b0 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20  /.  int rLhs;   
179c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
179d0 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67  ister(s) holding
179e0 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20   the LHS values 
179f0 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69  */.  int rLhsOri
17a00 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48  g;         /* LH
17a10 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74  S values prior t
17a20 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20  o reordering by 
17a30 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62  aiMap[] */.  Vdb
17a40 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
17a50 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
17a60 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17a70 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d  on */.  int *aiM
17a80 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ap = 0;       /*
17a90 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72   Map from vector
17aa0 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20   field to index 
17ab0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
17ac0 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20   *zAff = 0;     
17ad0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
17ae0 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69  ring for compari
17af0 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  sons */.  int nV
17b00 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
17b10 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
17b20 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rs for this IN o
17b30 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
17b40 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
17b50 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
17b60 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
17b70 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
17b80 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
17b90 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
17ba0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17bb0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  or */.  int i;  
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17bd0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
17be0 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 32  .  int destStep2
17bf0 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
17c00 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e  e to jump when N
17c10 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65  ULLs seen in ste
17c20 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  p 2 */.  int des
17c30 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f  tStep6 = 0;    /
17c40 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20  * Start of code 
17c50 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20  for Step 6 */.  
17c60 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b  int addrTruthOp;
17c70 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17c80 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20   of opcode that 
17c90 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49  determines the I
17ca0 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
17cb0 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20  nt destNotNull; 
17cc0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
17cd0 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e if a compariso
17ce0 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e  n is not true in
17cf0 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   step 6 */.  int
17d00 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
17d10 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
17d20 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20   step-6 loop */ 
17d30 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70  ..  pLeft = pExp
17d40 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20  r->pLeft;.  if( 
17d50 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
17d60 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
17d70 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41  ) ) return;.  zA
17d80 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  ff = exprINAffin
17d90 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
17da0 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20  r);.  nVector = 
17db0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
17dc0 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
17dd0 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28  ft);.  aiMap = (
17de0 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  int*)sqlite3DbMa
17df0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20  llocZero(.      
17e00 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63  pParse->db, nVec
17e10 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29  tor*(sizeof(int)
17e20 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29   + sizeof(char))
17e30 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20   + 1.  );.  if( 
17e40 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17e50 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
17e60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
17e70 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20  N_oom_error;..  
17e80 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
17e90 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41  mpute the RHS. A
17ea0 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
17eb0 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  if anything othe
17ec0 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49  r than.  ** IN_I
17ed0 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
17ee0 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65  urned, the table
17ef0 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73   opened ith curs
17f00 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  or pExpr->iTable
17f10 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   .  ** contains 
17f20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
17f30 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
17f40 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
17f50 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
17f60 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
17f70 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
17f80 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
17f90 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
17fa0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
17fb0 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
17fc0 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
17fd0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
17fe0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
17ff0 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
18000 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
18010 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
18020 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
18030 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
18060 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
18070 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
180a0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
180b0 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
180c0 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65   aiMap);..  asse
180d0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
180e0 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c   || nVector==1 |
180f0 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
18100 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20  X_EPH.       || 
18110 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
18120 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79  INDEX_ASC || eTy
18130 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
18140 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69  EX_DESC .  );.#i
18150 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
18160 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74  G.  /* Confirm t
18170 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74  hat aiMap[] cont
18180 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74  ains nVector int
18190 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77  eger values betw
181a0 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e  een 0 and.  ** n
181b0 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66  Vector-1. */.  f
181c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
181d0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
181e0 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72   j, cnt;.    for
181f0 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63  (cnt=j=0; j<nVec
18200 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69  tor; j++) if( ai
18210 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b  Map[j]==i ) cnt+
18220 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  +;.    assert( c
18230 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e  nt==1 );.  }.#en
18240 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  dif..  /* Code t
18250 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
18260 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
18270 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68  IN (...)". If th
18280 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a  e LHS is a .  **
18290 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74   vector, then it
182a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
182b0 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f   array of nVecto
182c0 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  r registers star
182d0 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31  ting .  ** at r1
182e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69  ..  **.  ** sqli
182f0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
18300 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72   might have reor
18310 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73  dered the fields
18320 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74   of the LHS vect
18330 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  or.  ** so that 
18340 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69  the fields are i
18350 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
18360 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   as an existing 
18370 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a  index.   The.  *
18380 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20  * aiMap[] array 
18390 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69  contains a mappi
183a0 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ng from the orig
183b0 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f  inal LHS field o
183c0 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  rder to.  ** the
183d0 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61   field order tha
183e0 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48  t matches the RH
183f0 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  S index..  */.  
18400 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18410 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18420 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43  rLhsOrig = exprC
18430 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
18440 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79  , pLeft, &iDummy
18450 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
18460 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70  nVector && aiMap
18470 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f  [i]==i; i++){} /
18480 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73  * Are LHS fields
18490 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20   reordered? */. 
184a0 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20   if( i==nVector 
184b0 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69  ){.    /* LHS fi
184c0 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f  elds are not reo
184d0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c  rdered */.    rL
184e0 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20  hs = rLhsOrig;. 
184f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
18500 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74  eed to reorder t
18510 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63  he LHS fields ac
18520 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70  cording to aiMap
18530 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73   */.    rLhs = s
18540 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
18550 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
18560 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
18570 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
18580 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18590 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
185a0 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b  _Copy, rLhsOrig+
185b0 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d  i, rLhs+aiMap[i]
185c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
185d0 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
185e0 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
185f0 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
18600 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
18610 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
18620 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
18630 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
18640 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
18650 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
18660 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
18670 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  risons..  **.  *
18680 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28  * This is step (
18690 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65  1) in the in-ope
186a0 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a  rator.md optimiz
186b0 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ed algorithm..  
186c0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
186d0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
186e0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
186f0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
18700 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
18710 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
18720 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
18730 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
18740 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
18750 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
18760 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18770 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67  .    int r2, reg
18780 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20  ToFree;.    int 
18790 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20  regCkNull = 0;. 
187a0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61     int ii;.    a
187b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
187c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
187d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
187e0 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
187f0 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
18800 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
18810 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
18820 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18840 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
18850 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73  tAnd, rLhs, rLhs
18860 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
18870 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
18880 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
18890 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
188a0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
188b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
188c0 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
188d0 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
188e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
188f0 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
18900 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
18910 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
18920 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
18930 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18940 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
18950 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
18960 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
18970 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
18980 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
18990 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
189a0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
189b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
189c0 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c  Op4(v, OP_Eq, rL
189d0 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c  hs, labelOk, r2,
189e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
189f0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
18a00 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
18a10 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64  SEQ);.        Vd
18a20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
18a30 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
18a40 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
18a50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
18a60 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  ==pList->nExpr-1
18a70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18a80 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
18a90 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20  , zAff[0]);.    
18aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18ab0 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
18ac0 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
18ad0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
18ae0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
18af0 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65   OP_Ne, rLhs, de
18b00 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
18b30 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
18b40 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
18b50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
18b60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
18b70 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51  (v, zAff[0] | SQ
18b80 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
18b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18ba0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18bb0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18bc0 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  gToFree);.    }.
18bd0 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
18be0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
18bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18c00 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b  OP_IsNull, regCk
18c10 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
18c20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18c30 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
18c40 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
18c50 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
18c60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18c70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18c80 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
18c90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18ca0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
18cb0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f  kNull);.    goto
18cc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18cd0 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  IN_finished;.  }
18ce0 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43  ..  /* Step 2: C
18cf0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
18d00 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20  he LHS contains 
18d10 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  any NULL columns
18d20 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c  .  If the.  ** L
18d30 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  HS does contain 
18d40 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72  NULLs then the r
18d50 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69  esult must be ei
18d60 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55  ther FALSE or NU
18d70 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  LL..  ** We will
18d80 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62   then skip the b
18d90 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 20  inary search of 
18da0 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
18db0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
18dc0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
18dd0 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
18de0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65  estIfFalse;.  }e
18df0 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65  lse{.    destSte
18e00 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d  p2 = destStep6 =
18e10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18e20 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20  Label(v);.  }.  
18e30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18e40 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
18e50 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
18e60 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
18e70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
18e80 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
18e90 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
18ea0 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
18eb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18ec0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68  , OP_IsNull, rLh
18ed0 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b  s+i, destStep2);
18ee0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
18ef0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
18f00 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20  }..  /* Step 3. 
18f10 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20   The LHS is now 
18f20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
18f30 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69  NULL.  Do the bi
18f40 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a  nary search.  **
18f50 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e   of the RHS usin
18f60 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70  g the LHS as a p
18f70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  robe.  If found,
18f80 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20   the result is. 
18f90 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   ** true..  */. 
18fa0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
18fb0 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
18fc0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
18fd0 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
18fe0 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
18ff0 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77   b-tree and so w
19000 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e  e also.    ** kn
19010 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ow that the RHS 
19020 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65  is non-NULL.  He
19030 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20  nce, we combine 
19040 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20  steps 3 and 4.  
19050 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67    ** into a sing
19060 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  le opcode. */.  
19070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19080 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
19090 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
190a0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
190b0 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65   rLhs);.    Vdbe
190c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
190d0 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
190e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
190f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f  (v, OP_Goto);  /
19100 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f  * Return True */
19110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
19120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19130 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
19140 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30  rLhs, nVector, 0
19150 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29  , zAff, nVector)
19160 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
19170 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
19180 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  l ){.      /* Co
19190 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64  mbine Step 3 and
191a0 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73   Step 5 into a s
191b0 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  ingle opcode */.
191c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
191d0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
191e0 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
191f0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
19200 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20  False,.         
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
19230 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19240 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71  );.      goto sq
19250 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
19260 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
19270 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20      /* Ordinary 
19280 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20  Step 3, for the 
19290 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45  case where FALSE
192a0 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69   and NULL are di
192b0 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64  stinct */.    ad
192c0 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
192d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
192e0 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
192f0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a  xpr->iTable, 0,.
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
19330 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
19340 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
19350 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
19360 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
19370 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
19380 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
19390 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
193a0 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
193b0 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
193c0 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
193d0 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
193e0 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
193f0 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
19400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19410 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
19420 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
19430 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
19440 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19450 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
19460 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
19470 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
19480 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
19490 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
194a0 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
194b0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
194c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
194d0 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
194e0 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
194f0 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
19500 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
19510 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
19520 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
19530 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
19540 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
19550 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
19560 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
19570 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19580 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
19590 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
195a0 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
195b0 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
195c0 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
195d0 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
195e0 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
195f0 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
19600 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
19610 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
19620 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
19630 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
19640 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19650 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
19660 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
19670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19680 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
19690 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
196a0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56  estIfFalse);.  V
196b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
196c0 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
196d0 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  ){.    destNotNu
196e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
196f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19700 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
19710 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
19720 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
19730 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
19740 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
19750 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
19760 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
19770 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
19780 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
19790 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
197a0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
197b0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
197c0 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
197d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
197e0 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
197f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19800 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
19810 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
19820 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
19830 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
19840 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
19850 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
19860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19870 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
19880 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
19890 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  le, i, r3);.    
198a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
198b0 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
198c0 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
198d0 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
198e0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
198f0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
19900 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
19910 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
19920 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19930 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
19940 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
19950 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19960 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
19970 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
19980 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
19990 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
199a0 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
199b0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
199c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
199d0 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69  P_Next, pExpr->i
199e0 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31  Table, addrTop+1
199f0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
19a00 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
19a10 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72  Step 7:  If we r
19a20 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
19a30 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
19a40 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20  e result must.  
19a50 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a    ** be false. *
19a60 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
19a70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19a80 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
19a90 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  se);.  }..  /* J
19aa0 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64  umps here in ord
19ab0 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75  er to return tru
19ac0 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
19ad0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
19ae0 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71  ddrTruthOp);..sq
19af0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
19b00 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
19b10 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29  rLhs!=rLhsOrig )
19b20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19b30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19b40 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Lhs);.  sqlite3E
19b50 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
19b60 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  se);.  VdbeComme
19b70 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
19b80 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45  xpr"));.sqlite3E
19b90 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
19ba0 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
19bb0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
19bc0 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74   aiMap);.  sqlit
19bd0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
19be0 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65  >db, zAff);.}.#e
19bf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
19c00 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
19c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19c20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
19c30 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
19c40 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
19c50 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
19c60 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
19c70 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
19c80 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
19c90 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
19ca0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
19cb0 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
19cc0 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
19cd0 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
19ce0 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
19cf0 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
19d00 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
19d10 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
19d20 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
19d30 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
19d40 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
19d50 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
19d60 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
19d70 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
19d80 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
19d90 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
19da0 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
19db0 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
19dc0 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  le value;.    sq
19dd0 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
19de0 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
19df0 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
19e00 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
19e10 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
19e20 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
19e30 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
19e40 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
19e50 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
19e60 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
19e70 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
19e80 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
19e90 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
19ea0 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
19eb0 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  ue, P4_REAL);.  
19ec0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
19ed0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
19ee0 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
19ef0 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
19f00 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
19f10 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
19f20 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
19f30 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
19f40 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
19f50 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
19f60 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
19f70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
19f80 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
19f90 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
19fa0 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
19fb0 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
19fc0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
19fd0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
19fe0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
19ff0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1a000 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
1a010 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
1a020 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
1a030 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
1a040 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
1a050 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a060 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
1a070 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
1a080 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
1a090 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
1a0a0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
1a0b0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1a0c0 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
1a0d0 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
1a0e0 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
1a0f0 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
1a100 69 66 28 20 63 3d 3d 31 20 7c 7c 20 28 63 3d 3d  if( c==1 || (c==
1a110 32 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c  2 && !negFlag) |
1a120 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61  | (negFlag && va
1a130 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  lue==SMALLEST_IN
1a140 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51  T64)){.#ifdef SQ
1a150 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1a160 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
1a170 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a180 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
1a190 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
1a1a0 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
1a1b0 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
1a1c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a1d0 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
1a1e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a1f0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
1a200 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
1a210 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a220 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
1a230 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
1a240 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f   %s%s", negFlag?
1a250 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20  "-":"",z);.     
1a260 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1a270 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
1a280 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
1a290 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
1a2a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a2b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1a2c0 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
1a2d0 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c  e = c==2 ? SMALL
1a2e0 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
1a2f0 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ue; }.      sqli
1a300 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1a310 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  8(v, OP_Int64, 0
1a320 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1a330 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34  &value, P4_INT64
1a340 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1a350 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f 6c 75  /*.** Erase colu
1a360 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79 20 6e  mn-cache entry n
1a370 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61 74 69  umber i.*/.stati
1a380 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72  c void cacheEntr
1a390 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  yClear(Parse *pP
1a3a0 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a 20 20  arse, int i){.  
1a3b0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1a3c0 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67  Cache[i].tempReg
1a3d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1a3e0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1a3f0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1a400 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
1a410 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1a420 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1a430 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d  Reg++] = pParse-
1a440 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
1a450 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
1a460 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1a470 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70 50 61  e--;.  if( i<pPa
1a480 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1a490 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43  {.    pParse->aC
1a4a0 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61  olCache[i] = pPa
1a4b0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70  rse->aColCache[p
1a4c0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1a4d0 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ];.  }.}.../*.**
1a4e0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63   Record in the c
1a4f0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74  olumn cache that
1a500 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f   a particular co
1a510 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70  lumn from a.** p
1a520 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
1a530 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70  is stored in a p
1a540 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
1a550 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
1a560 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1a570 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1a580 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
1a590 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  Col, int iReg){.
1a5a0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
1a5b0 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78  inLru;.  int idx
1a5c0 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43  Lru;.  struct yC
1a5d0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f  olCache *p;..  /
1a5e0 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  * Unless an erro
1a5f0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
1a600 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1a610 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
1a620 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tive. */.  asser
1a630 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61  t( iReg>0 || pPa
1a640 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
1a650 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1a660 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
1a670 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
1a680 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
1a690 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
1a6a0 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
1a6b0 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
1a6c0 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
1a6d0 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
1a6e0 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
1a6f0 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
1a700 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
1a710 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
1a720 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
1a730 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
1a740 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
1a750 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
1a760 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
1a770 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1a780 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
1a790 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  b, SQLITE_Column
1a7a0 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b  Cache) ) return;
1a7b0 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70  ..  /* First rep
1a7c0 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e  lace any existin
1a7d0 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20  g entry..  **.  
1a7e0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
1a7f0 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20   way the column 
1a800 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74  cache is current
1a810 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20  ly used, we are 
1a820 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20  guaranteed.  ** 
1a830 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20  that the object 
1a840 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61  will never alrea
1a850 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20  dy be in cache. 
1a860 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61   Verify this gua
1a870 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66  rantee..  */.#if
1a880 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f  ndef NDEBUG.  fo
1a890 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1a8a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1a8b0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1a8c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1a8d0 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
1a8e0 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
1a8f0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
1a900 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1a910 49 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20  If the cache is 
1a920 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20 64 65  already full, de
1a930 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74 20 72  lete the least r
1a940 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65 6e 74  ecently used ent
1a950 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ry */.  if( pPar
1a960 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e 3d 53  se->nColCache>=S
1a970 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1a980 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75 20 3d   ){.    minLru =
1a990 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
1a9a0 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
1a9b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1a9c0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1a9d0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
1a9e0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
1a9f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75        if( p->lru
1aa00 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
1aa10 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20     idxLru = i;. 
1aa20 20 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20         minLru = 
1aa30 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20 7d 0a  p->lru;.      }.
1aa40 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70      }.    p = &p
1aa50 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1aa60 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73  [idxLru];.  }els
1aa70 65 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  e{.    p = &pPar
1aa80 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50  se->aColCache[pP
1aa90 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b  arse->nColCache+
1aaa0 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  +];.  }..  /* Ad
1aab0 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
1aac0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1aad0 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 70 2d 3e  e cache */.  p->
1aae0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
1aaf0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
1ab00 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
1ab10 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  ;.  p->iColumn =
1ab20 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52 65 67   iCol;.  p->iReg
1ab30 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e 74 65   = iReg;.  p->te
1ab40 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  mpReg = 0;.  p->
1ab50 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
1ab60 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a  acheCnt++;.}../*
1ab70 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
1ab80 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
1ab90 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
1aba0 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
1abb0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
1abc0 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
1abd0 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
1abe0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
1abf0 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
1ac00 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1ac10 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1ac20 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
1ac30 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d  nReg){.  int i =
1ac40 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 70   0;.  while( i<p
1ac50 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1ac60 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 79   ){.    struct y
1ac70 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20 26 70  ColCache *p = &p
1ac80 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1ac90 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
1aca0 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26 26 20  iReg >= iReg && 
1acb0 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67 2b 6e  p->iReg < iReg+n
1acc0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
1acd0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
1ace0 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c  rse, i);.    }el
1acf0 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  se{.      i++;. 
1ad00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ad10 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
1ad20 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
1ad30 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
1ad40 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
1ad50 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
1ad60 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1ad70 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
1ad80 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
1ad90 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
1ada0 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
1adb0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1adc0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1add0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1ade0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1adf0 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
1ae00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1ae10 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1ae20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1ae30 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1ae40 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
1ae50 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1ae60 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1ae70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
1ae80 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
1ae90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1aea0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
1aeb0 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
1aec0 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
1aed0 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
1aee0 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
1aef0 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
1af00 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
1af10 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
1af20 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1af30 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
1af40 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
1af50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1af60 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
1af70 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
1af80 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61 73 73 65  nt i = 0;.  asse
1af90 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1afa0 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20  heLevel>=1 );.  
1afb0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1afc0 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51  vel--;.#ifdef SQ
1afd0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1afe0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1aff0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1b000 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1b010 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74    printf("POP  t
1b020 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
1b030 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
1b040 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
1b050 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e( i<pParse->nCo
1b060 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 69 66  lCache ){.    if
1b070 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
1b080 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e 70 50  che[i].iLevel>pP
1b090 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1b0a0 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
1b0b0 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
1b0c0 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, i);.    }else
1b0d0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
1b0e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1b0f0 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f  When a cached co
1b100 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20  lumn is reused, 
1b110 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69  make sure that i
1b120 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ts register is.*
1b130 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69  * no longer avai
1b140 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20  lable as a temp 
1b150 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65  register.  ticke
1b160 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73  t #3879:  that s
1b170 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ame.** register 
1b180 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20  might be in the 
1b190 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c  cache in multipl
1b1a0 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20  e places, so be 
1b1b0 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74  sure to.** get t
1b1c0 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  hem all..*/.stat
1b1d0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
1b1e0 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
1b1f0 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
1b200 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
1b210 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1b220 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
1b230 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1b240 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1b250 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1b260 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1b270 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
1b280 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
1b290 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
1b2a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e   }.  }.}../* Gen
1b2b0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1b2c0 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72  will load into r
1b2d0 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61  egister regOut a
1b2e0 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1b2f0 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
1b300 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68  r the iIdxCol-th
1b310 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
1b320 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73   pIdx..*/.void s
1b330 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
1b340 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20  adIndexColumn(. 
1b350 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b360 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1b370 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
1b380 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20  ex *pIdx,    /* 
1b390 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
1b3a0 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20  column is to be 
1b3b0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1b3c0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43  iTabCur,    /* C
1b3d0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1b3e0 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  o a table row */
1b3f0 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20  .  int iIdxCol, 
1b400 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
1b410 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
1b420 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1b430 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1b440 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64  /* Store the ind
1b450 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  ex column value 
1b460 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1b470 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61   */.){.  i16 iTa
1b480 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  bCol = pIdx->aiC
1b490 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a  olumn[iIdxCol];.
1b4a0 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58    if( iTabCol==X
1b4b0 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73  N_EXPR ){.    as
1b4c0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1b4d0 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
1b4e0 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1b4f0 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f  pr->nExpr>iIdxCo
1b500 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  l );.    pParse-
1b510 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62  >iSelfTab = iTab
1b520 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
1b530 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
1b540 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
1b550 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
1b560 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
1b570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b580 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1b590 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61  olumnOfTable(pPa
1b5a0 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78  rse->pVdbe, pIdx
1b5b0 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75  ->pTable, iTabCu
1b5c0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20         iTabCol, 
1b5f0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1b600 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b610 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
1b620 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1b630 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
1b640 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
1b650 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1b660 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1b670 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
1b680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1b690 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
1b6a0 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
1b6b0 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
1b6c0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1b6d0 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
1b6e0 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1b6f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
1b700 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
1b710 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
1b720 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
1b730 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
1b740 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
1b750 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
1b760 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1b770 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1b780 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
1b790 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1b7a0 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30  .){.  if( iCol<0
1b7b0 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
1b7c0 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
1b7d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b7e0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
1b7f0 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
1b800 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
1b810 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
1b820 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
1b830 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
1b840 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a    int x = iCol;.
1b850 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
1b860 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69  d(pTab) && !IsVi
1b870 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1b880 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
1b890 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71  ColumnOfIndex(sq
1b8a0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
1b8b0 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c  ndex(pTab), iCol
1b8c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1b8d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1b8e0 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78  , op, iTabCur, x
1b8f0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
1b900 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
1b910 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
1b920 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
1b930 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
1b940 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b950 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1b960 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
1b970 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
1b980 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
1b990 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
1b9a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
1b9b0 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
1b9c0 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72   .**.** An effor
1b9d0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f  t is made to sto
1b9e0 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1b9f0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1ba00 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69  iReg.  This.** i
1ba10 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64  s not garanteeed
1ba20 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29   for GetColumn()
1ba30 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63 61   - the result ca
1ba40 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  n be stored in.*
1ba50 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20  * any register. 
1ba60 20 42 75 74 20 74 68 65 20 72 65 73 75 6c 74 20   But the result 
1ba70 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1ba80 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65   land in registe
1ba90 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65  r iReg.** for Ge
1baa0 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a  tColumnToReg()..
1bab0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
1bac0 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
1bad0 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
1bae0 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
1baf0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
1bb00 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
1bb10 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
1bb20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
1bb30 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
1bb40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1bb50 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1bb60 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1bb70 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
1bb80 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
1bb90 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
1bba0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1bbb0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
1bbc0 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
1bbd0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
1bbe0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
1bbf0 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
1bc00 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
1bc10 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
1bc20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
1bc30 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
1bc40 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
1bc50 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
1bc60 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
1bc70 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1bc80 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
1bc90 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
1bca0 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46  or OP_Column + F
1bcb0 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  LAGS */.){.  Vdb
1bcc0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1bcd0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1bce0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1bcf0 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
1bd00 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1bd10 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1bd20 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1bd30 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
1bd40 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1bd50 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
1bd60 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1bd70 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
1bd80 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
1bd90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bda0 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1bdb0 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
1bdc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1bdd0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
1bde0 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
1bdf0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1be00 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1be10 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
1be20 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1be30 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
1be40 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
1be50 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1be60 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20   p5);.  }else{  
1be70 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70   .    sqlite3Exp
1be80 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1be90 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
1bea0 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a  umn, iReg);.  }.
1beb0 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1bec0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1bed0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
1bee0 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Reg(.  Parse *pP
1bef0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1bf00 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1bf10 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1bf20 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1bf30 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1bf40 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1bf50 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1bf60 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1bf70 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1bf80 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1bf90 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1bfa0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1bfb0 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1bfc0 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1bfd0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
1bfe0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1bff0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1c000 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  .){.  int r1 = s
1c010 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1c020 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1c030 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  pTab, iColumn, i
1c040 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b  Table, iReg, 0);
1c050 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67 20  .  if( r1!=iReg 
1c060 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
1c070 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1c080 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  e, OP_SCopy, r1,
1c090 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iReg);.}.../*.*
1c0a0 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
1c0b0 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
1c0c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c0d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1c0e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1c0f0 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 20 53 51    int i;..#if SQ
1c100 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1c110 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1c120 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1c130 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1c140 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
1c150 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
1c160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1c170 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1c180 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
1c190 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1c1a0 69 5d 2e 74 65 6d 70 52 65 67 0a 20 20 20 20 20  i].tempReg.     
1c1b0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
1c1c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1c1d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a  arse->aTempReg).
1c1e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 70 50      ){.       pP
1c1f0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1c200 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1c210 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1c220 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1c230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1c240 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
1c250 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
1c260 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1c270 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
1c280 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
1c290 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
1c2a0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1c2b0 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
1c2c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c2d0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1c2e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1c2f0 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
1c300 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73  int iCount){.  s
1c310 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1c320 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53  emove(pParse, iS
1c330 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d  tart, iCount);.}
1c340 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c350 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
1c360 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
1c370 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
1c380 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
1c390 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
1c3a0 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
1c3b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
1c3c0 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
1c3d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1c3e0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1c3f0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1c400 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
1c410 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
1c420 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
1c430 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
1c440 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1c450 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1c460 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
1c470 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
1c480 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1c490 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1c4a0 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a  , iFrom, nReg);.
1c4b0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1c4c0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1c4d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1c4e0 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a  OVERAGE_TEST)./*
1c4f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1c500 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
1c510 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
1c520 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
1c530 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
1c540 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
1c550 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  lumn cache..**.*
1c560 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c570 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73  s used within as
1c580 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
1c590 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c  ase() macros onl
1c5a0 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
1c5b0 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f  t appear in a no
1c5c0 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  rmal build..*/.s
1c5d0 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
1c5e0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
1c5f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c600 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
1c610 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1c620 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1c630 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1c640 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1c650 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1c660 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1c670 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
1c680 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
1c690 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
1c6a0 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f  ) return 1;    /
1c6b0 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20  *NO_TEST*/.  }. 
1c6c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c6d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1c6e0 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f  BUG || SQLITE_CO
1c6f0 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a  VERAGE_TEST */..
1c700 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1c710 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1c720 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
1c730 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e  REGISTER referen
1c740 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72  cing.** register
1c750 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c   iReg.  The call
1c760 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1c770 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79  hat iReg already
1c780 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
1c790 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1c7a0 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1c7b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1c7c0 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
1c7d0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
1c7e0 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
1c7f0 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
1c800 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1c810 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
1c820 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
1c830 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
1c840 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c  );.}../*.** Eval
1c850 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1c860 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63  on (either a vec
1c870 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20  tor or a scalar 
1c880 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20  expression) and 
1c890 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
1c8a0 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f  ult in continguo
1c8b0 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  us temporary reg
1c8c0 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20  isters.  Return 
1c8d0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1c8e0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1c8f0 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
1c900 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1c910 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
1c920 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1c930 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1c940 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61  y scalar, then a
1c950 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61  lso write.** tha
1c960 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
1c970 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62  r into *piFreeab
1c980 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  le.  If the retu
1c990 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1c9a0 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  ster.** is not a
1c9b0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66   temporary or if
1c9c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c9d0 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20  is a vector set 
1c9e0 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74  *piFreeable.** t
1c9f0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
1ca00 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  nt exprCodeVecto
1ca10 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1ca20 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70   Expr *p, int *p
1ca30 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e  iFreeable){.  in
1ca40 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t iResult;.  int
1ca50 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
1ca60 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
1ca70 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75  (p);.  if( nResu
1ca80 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65  lt==1 ){.    iRe
1ca90 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1caa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1cab0 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65  e, p, piFreeable
1cac0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cad0 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b  *piFreeable = 0;
1cae0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
1caf0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
1cb00 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1cb10 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
1cb20 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20  t(pParse, p, 0, 
1cb30 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1cb40 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1cb50 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72    iResult = pPar
1cb60 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1cb70 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1cb80 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  = nResult;.     
1cb90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
1cba0 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
1cbb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cbc0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61  deFactorable(pPa
1cbd0 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  rse, p->x.pList-
1cbe0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69  >a[i].pExpr, i+i
1cbf0 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
1cc00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cc10 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn iResult;.}..
1cc20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cc30 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
1cc40 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
1cc50 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
1cc60 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
1cc70 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
1cc80 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1cc90 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
1cca0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
1ccb0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
1ccc0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1ccd0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
1cce0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1ccf0 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
1cd00 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
1cd10 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
1cd20 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
1cd30 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
1cd40 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
1cd50 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
1cd60 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
1cd70 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
1cd80 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
1cd90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
1cda0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
1cdb0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
1cdc0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
1cdd0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
1cde0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
1cdf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ce00 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
1ce10 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1ce20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
1ce30 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1ce40 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
1ce50 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
1ce60 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
1ce70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ce80 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
1ce90 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
1cea0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
1ceb0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
1cec0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
1ced0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
1cee0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
1cef0 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
1cf00 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1cf10 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1cf20 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1cf30 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1cf40 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1cf50 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1cf60 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1cf70 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1cf80 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20   r1, r2;        
1cf90 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
1cfa0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
1cfb0 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  rs */.  Expr tem
1cfc0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1cfd0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
1cfe0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
1cff0 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a  /.  int p5 = 0;.
1d000 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1d010 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1d020 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1d030 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
1d040 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1d050 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1d060 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
1d070 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
1d080 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
1d090 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
1d0a0 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
1d0b0 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
1d0c0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1d0d0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
1d0e0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
1d0f0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1d100 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1d110 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
1d120 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1d130 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1d140 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
1d150 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
1d160 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1d170 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1d180 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
1d190 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1d1a0 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20  rn pCol->iMem;. 
1d1b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1d1c0 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
1d1d0 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
1d1e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d1f0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1d200 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
1d210 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d230 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1d240 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
1d250 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1d260 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
1d280 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
1d290 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
1d2a0 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
1d2b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d2c0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1d2d0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78    int iTab = pEx
1d2e0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1d2f0 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a    if( iTab<0 ){.
1d300 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
1d310 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a  se->ckBase>0 ){.
1d320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1d330 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
1d340 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
1d350 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
1d360 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
1d370 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1d380 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
1d390 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
1d3a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d3b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e          /* Codin
1d3c0 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
1d3d0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1d3e0 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63  an index where c
1d3f0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20  olumn names.    
1d400 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1d410 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74  index refer to t
1d420 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63  he table to whic
1d430 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f  h the index belo
1d440 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ngs */.         
1d450 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
1d460 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1d470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d480 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d490 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d4a0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
1d4b0 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
1d4e0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67  lumn, iTab, targ
1d4f0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a     pExpr->op2);.
1d520 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d530 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
1d540 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1d550 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
1d560 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d570 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d580 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d590 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1d5a0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1d5b0 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1d5c0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d5d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d5e0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d5f0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
1d600 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
1d610 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
1d620 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1d630 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1d640 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1d650 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1d660 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d670 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d680 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1d690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d6a0 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
1d6b0 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e  arget, pExpr->u.
1d6c0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72  zToken);.      r
1d6d0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1d6e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d6f0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1d700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d710 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1d720 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1d730 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1d740 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1d750 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
1d760 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
1d770 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
1d780 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
1d790 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
1d7a0 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
1d7b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d7c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d7d0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d7e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d7f0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d800 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
1d810 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1d820 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
1d830 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1d840 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
1d850 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
1d860 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
1d870 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
1d880 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
1d890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d8a0 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
1d8b0 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
1d8c0 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
1d8d0 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
1d8e0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
1d8f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d900 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
1d910 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
1d920 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1d930 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1d940 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1d950 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1d960 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
1d970 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d980 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d990 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d9b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
1d9c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d9d0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d9e0 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
1d9f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1da00 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
1da10 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1da20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1da30 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
1da40 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
1da50 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1da60 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73  *z = sqlite3VLis
1da70 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73  tNumToName(pPars
1da80 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72  e->pVList, pExpr
1da90 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1daa0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1dab0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1dac0 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45  '?' || strcmp(pE
1dad0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a  xpr->u.zToken, z
1dae0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1daf0 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30  pParse->pVList[0
1db00 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61  ] = 0; /* Indica
1db10 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20  te VList may no 
1db20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67  longer be enlarg
1db30 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1db40 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
1db50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50  4(v, (char*)z, P
1db60 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1db70 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1db80 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1db90 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1dba0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
1dbb0 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  rn pExpr->iTable
1dbc0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1dbd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1dbe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1dbf0 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
1dc00 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1dc10 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
1dc20 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
1dc30 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1dc40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1dc50 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1dc60 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1dc70 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
1dc80 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
1dc90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1dca0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1dcb0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1dcc0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1dcd0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1dce0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1dcf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dd00 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
1dd10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dd20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dd30 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
1dd40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1dd50 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ));.      testca
1dd60 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
1dd70 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
1dd80 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
1dd90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dda0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ddb0 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
1ddc0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74  g, 1);.      ret
1ddd0 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d  urn inReg;.    }
1dde0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ddf0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1de00 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1de10 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1de20 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
1de30 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1de40 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1de50 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
1de60 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
1de70 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
1de80 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1de90 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1dea0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1deb0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1dec0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1ded0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1dee0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1def0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1df00 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1df10 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1df20 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
1df30 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
1df40 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1df50 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35  , target, op, p5
1df60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1df70 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1df80 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1df90 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1dfa0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1dfb0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1dfc0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1dfd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1dfe0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1dff0 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
1e000 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
1e010 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1e020 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1e030 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
1e040 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
1e050 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61  | p5);.        a
1e060 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1e070 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1e080 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1e090 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e0a0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
1e0b0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e0c0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e0d0 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e0e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e0f0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
1e100 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1e110 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1e120 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1e130 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e140 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
1e150 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1e160 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1e170 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1e180 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e190 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
1e1a0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1e1b0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1e1c0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1e1d0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e1e0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
1e1f0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1e200 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1e210 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1e220 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e230 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
1e240 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e250 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1e260 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e270 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1e280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e290 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e2a0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1e2b0 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
1e2c0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
1e2d0 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
1e2e0 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
1e2f0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
1e300 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
1e310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1e320 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1e330 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
1e340 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
1e350 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
1e360 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1e370 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1e380 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
1e390 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
1e3a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e3b0 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
1e3c0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
1e3d0 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
1e3e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e3f0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
1e400 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
1e410 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
1e420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e430 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
1e440 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e450 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
1e460 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
1e470 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
1e480 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e490 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
1e4a0 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
1e4b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e4c0 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
1e4d0 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
1e4e0 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
1e4f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e500 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
1e510 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1e520 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
1e530 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e540 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
1e550 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e560 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
1e570 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
1e580 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
1e590 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
1e5a0 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
1e5b0 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
1e5c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e5d0 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
1e5e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
1e5f0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
1e600 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
1e610 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
1e620 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e630 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
1e640 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
1e650 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
1e660 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
1e670 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e680 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e690 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e6a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e6b0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1e6c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e6d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e6e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1e6f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e700 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
1e710 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1e720 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e730 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e740 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e750 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1e760 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e770 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1e780 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1e790 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1e7a0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
1e7b0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
1e7c0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
1e7d0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
1e7e0 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
1e7f0 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
1e800 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1e810 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e820 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
1e830 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1e840 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
1e850 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
1e860 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
1e870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1e880 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e890 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e8a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
1e8b0 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
1e8c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
1e8d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e8e0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1e8f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1e900 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
1e910 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
1e920 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1e930 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
1e940 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
1e950 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1e960 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
1e970 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e980 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e990 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
1e9a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e9b0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1e9c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e9d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e9e0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ea00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
1ea10 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
1ea20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1ea30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ea40 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ea50 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1ea60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ea70 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1ea80 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1ea90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1eaa0 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1eab0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1eac0 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1ead0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1eae0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1eaf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1eb00 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1eb10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1eb20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eb30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1eb40 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1eb50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eb60 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1eb70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb80 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1eb90 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
1eba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ebb0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1ebc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1ebd0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
1ebe0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73  t addr;.      as
1ebf0 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
1ec00 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
1ec10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ec20 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1ec30 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
1ec40 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
1ec50 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
1ec60 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
1ec70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ec80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1ec90 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
1eca0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1ecb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ecc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ecd0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1ece0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ecf0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ed00 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
1ed10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1ed20 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20  (v, op, r1);.   
1ed30 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1ed40 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
1ed50 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
1ed60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ed70 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
1ed80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ed90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1eda0 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
1edb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1edc0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1edd0 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  dr);.      break
1ede0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1edf0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1ee00 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1ee10 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
1ee20 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
1ee30 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
1ee40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1ee50 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ee60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ee70 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1ee80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ee90 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
1eea0 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20  e of aggregate: 
1eeb0 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e  %s()", pExpr->u.
1eec0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1eed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1eee0 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  turn pInfo->aFun
1eef0 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
1ef00 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
1ef10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ef20 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
1ef30 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
1ef40 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
1ef50 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1ef60 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1ef70 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
1ef80 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
1ef90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1efa0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1efb0 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
1efc0 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
1efd0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1efe0 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
1eff0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ject */.      co
1f000 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
1f010 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
1f020 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
1f030 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b     u32 constMask
1f040 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73   = 0;     /* Mas
1f050 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  k of function ar
1f060 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  guments that are
1f070 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20   constant */.   
1f080 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1f090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1f0a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1f0b0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1f0c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
1f0d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1f0e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
1f0f0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
1f100 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
1f110 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
1f120 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
1f130 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
1f140 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1f150 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
1f160 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
1f170 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46        if( ConstF
1f180 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
1f190 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1f1a0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
1f1b0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1f1c0 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    /* SQL functio
1f1d0 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ns can be expens
1f1e0 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d  ive. So try to m
1f1f0 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e  ove constant fun
1f200 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a  ctions.        *
1f210 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  * out of the inn
1f220 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66  er loop, even if
1f230 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65   that means an e
1f240 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f  xtra OP_Copy. */
1f250 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f260 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1f270 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1f280 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  xpr, -1);.      
1f290 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1f2a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f2b0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1f2c0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1f2d0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1f2e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1f2f0 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
1f300 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
1f310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f320 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
1f330 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1f340 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
1f350 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
1f360 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
1f370 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f380 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1f390 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1f3a0 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
1f3b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1f3c0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
1f3d0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
1f3e0 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65  b, zId, nFarg, e
1f3f0 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  nc, 0);.#ifdef S
1f400 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
1f410 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
1f420 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  N.      if( pDef
1f430 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65  ==0 && pParse->e
1f440 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
1f450 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1f460 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
1f470 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72   "unknown", nFar
1f480 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  g, enc, 0);.    
1f490 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1f4a0 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20   if( pDef==0 || 
1f4b0 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  pDef->xFinalize!
1f4c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1f4d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1f4e0 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
1f4f0 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20  unction: %s()", 
1f500 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  zId);.        br
1f510 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1f520 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61      /* Attempt a
1f530 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e   direct implemen
1f540 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  tation of the bu
1f550 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28  ilt-in COALESCE(
1f560 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49  ) and.      ** I
1f570 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
1f580 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  s.  This avoids 
1f590 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c  unnecessary eval
1f5a0 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  uation of.      
1f5b0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
1f5c0 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
1f5d0 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
1f5e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1f5f0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1f600 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1f610 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
1f620 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
1f630 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
1f640 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1f650 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1f660 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
1f670 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f680 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
1f690 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
1f6a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
1f6b0 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
1f6c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1f6d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f6e0 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
1f6f0 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
1f700 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1f710 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1f720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f730 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1f740 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67  ove(pParse, targ
1f750 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  et, 1);.        
1f760 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f770 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f780 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f790 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1f7a0 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1f7b0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1f7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f7d0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1f7e0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  se);.        }. 
1f7f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f800 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f810 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
1f820 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f830 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1f840 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
1f850 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1f860 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
1f870 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
1f880 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1f890 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
1f8a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1f8b0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1f8c0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
1f8d0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
1f8e0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1f8f0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72  >=1 );.        r
1f900 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1f910 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1f920 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
1f930 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1f940 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
1f950 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1f960 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49     /* The AFFINI
1f970 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76  TY() function ev
1f980 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72  aluates to a str
1f990 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
1f9a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
1f9b0 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1f9c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20   the argument.  
1f9d0 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
1f9e0 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20   testing of.    
1f9f0 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
1fa00 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20  type logic..    
1fa10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1fa20 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1fa30 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46   SQLITE_FUNC_AFF
1fa40 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20  INITY ){.       
1fa50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
1fa60 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c  ff[] = { "blob",
1fa70 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69   "text", "numeri
1fa80 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22  c", "integer", "
1fa90 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20  real" };.       
1faa0 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20   char aff;.     
1fab0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1fac0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
1fad0 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
1fae0 41 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e  Affinity(pFarg->
1faf0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
1fb00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fb10 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1fb20 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  rget, .         
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66       aff ? azAff
1fb50 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f  [aff-SQLITE_AFF_
1fb60 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b  BLOB] : "none");
1fb70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fb80 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1fb90 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f  #endif..      fo
1fba0 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=0; i<nFarg; 
1fbb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1fbc0 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65  ( i<32 && sqlite
1fbd0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
1fbe0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
1fbf0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1fc00 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20  testcase( i==31 
1fc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
1fc20 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  stMask |= MASKBI
1fc30 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20  T32(i);.        
1fc40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
1fc50 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1fc60 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
1fc70 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
1fc80 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
1fc90 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1fca0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1fcb0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
1fcc0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1fcd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1fce0 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
1fcf0 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61       if( constMa
1fd00 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sk ){.          
1fd10 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  r1 = pParse->nMe
1fd20 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m+1;.          p
1fd30 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1fd40 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65  Farg;.        }e
1fd50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1fd60 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1fd70 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1fd80 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  nFarg);.        
1fd90 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  }..        /* Fo
1fda0 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74  r length() and t
1fdb0 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e  ypeof() function
1fdc0 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20  s with a column 
1fdd0 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20  argument,.      
1fde0 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20    ** set the P5 
1fdf0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65  parameter to the
1fe00 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
1fe10 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  e to OPFLAG_LENG
1fe20 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a  THARG.        **
1fe30 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f   or OPFLAG_TYPEO
1fe40 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c  FARG respectivel
1fe50 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  y, to avoid unne
1fe60 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20  cessary data.   
1fe70 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e       ** loading.
1fe80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1fe90 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
1fea0 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49  uncFlags & (SQLI
1feb0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53  TE_FUNC_LENGTH|S
1fec0 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
1fed0 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  F))!=0 ){.      
1fee0 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20      u8 exprOp;. 
1fef0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ff00 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
1ff10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ff20 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1ff30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1ff40 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d   exprOp = pFarg-
1ff50 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b  >a[0].pExpr->op;
1ff60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
1ff70 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  xprOp==TK_COLUMN
1ff80 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41   || exprOp==TK_A
1ff90 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
1ffa0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ffb0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e   SQLITE_FUNC_LEN
1ffc0 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47  GTH==OPFLAG_LENG
1ffd0 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
1ffe0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1fff0 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d  ITE_FUNC_TYPEOF=
20000 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  =OPFLAG_TYPEOFAR
20010 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
20020 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d   testcase( pDef-
20030 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46  >funcFlags & OPF
20040 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
20050 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61  .            pFa
20060 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
20070 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20  op2 = .         
20080 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66           pDef->f
20090 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c  uncFlags & (OPFL
200a0 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46  AG_LENGTHARG|OPF
200b0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
200c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
200d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73      }..        s
200e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
200f0 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20  ush(pParse);    
20100 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
20110 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
20120 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20130 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
20140 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
20150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
20180 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
20190 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TOR);.        sq
201a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
201b0 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  p(pParse);      
201c0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
201d0 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
201e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
201f0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
20200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20210 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
20220 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
20230 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
20240 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
20250 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
20260 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
20270 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
20280 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
20290 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
202a0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
202b0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
202c0 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
202d0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
202e0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
202f0 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
20300 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
20310 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
20320 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
20330 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
20340 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
20350 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
20360 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
20370 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
20380 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
20390 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
203a0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
203b0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
203c0 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
203d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
203e0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
203f0 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
20400 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
20410 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
20420 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
20430 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
20440 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
20450 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
20460 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
20470 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
20480 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
20490 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
204a0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
204b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
204c0 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
204d0 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
204e0 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
204f0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
20500 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
20510 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
20520 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
20530 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
20540 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20550 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
20560 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
20570 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
20580 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
20590 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
205a0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
205b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
205c0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
205d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
205e0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
205f0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
20600 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
20610 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
20620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20630 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
20640 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
20650 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
20660 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
20670 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
20680 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20690 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74  Function0, const
206a0 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
206b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
206c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
206d0 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
206e0 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
206f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20700 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
20710 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
20720 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
20730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
20740 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
20750 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
20760 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
20770 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
20780 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
20790 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
207a0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
207b0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
207c0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
207d0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
207e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
207f0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
20800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
20810 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
20820 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
20830 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c  _SELECT && (nCol
20840 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
20850 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
20860 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  pr)!=1 ){.      
20870 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
20880 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
20890 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  nCol, 1);.      
208a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
208b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64  eturn sqlite3Cod
208c0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
208d0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
208e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
208f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20900 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  case TK_SELECT_C
20910 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
20920 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt n;.      if( 
20930 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
20940 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
20950 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
20960 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  >iTable = sqlite
20970 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
20980 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20990 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  eft, 0, 0);.    
209a0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
209b0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
209c0 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65  =0 || pExpr->pLe
209d0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  ft->op==TK_SELEC
209e0 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  T );.      if( p
209f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
20a00 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54      && pExpr->iT
20a10 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74  able!=(n = sqlit
20a20 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
20a30 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20  (pExpr->pLeft)) 
20a40 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
20a50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20a60 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f  g(pParse, "%d co
20a70 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25  lumns assigned %
20a80 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20  d values",.     
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
20ab0 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20  ->iTable, n);.  
20ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
20ad0 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  rn pExpr->pLeft-
20ae0 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d  >iTable + pExpr-
20af0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a  >iColumn;.    }.
20b00 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
20b10 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
20b20 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
20b30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
20b40 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
20b50 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
20b60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
20b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20b80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20b90 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
20ba0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20bb0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
20bc0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
20bd0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
20be0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
20bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20c00 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
20c10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
20c20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20c30 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
20c40 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lse);.      sqli
20c50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20c60 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
20c70 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  et, 0);.      sq
20c80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20c90 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e  Label(v, destIfN
20ca0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ull);.      retu
20cb0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
20cc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20cd0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
20ce0 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  */...    /*.    
20cf0 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
20d00 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
20d10 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
20d20 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
20d30 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
20d40 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
20d50 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
20d60 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
20d70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
20d80 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
20d90 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
20da0 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
20db0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
20dc0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
20dd0 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
20de0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
20df0 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f  : {.      exprCo
20e00 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
20e10 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
20e20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65   0, 0);.      re
20e30 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
20e40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
20e50 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  PAN:.    case TK
20e60 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
20e70 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
20e80 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20e90 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
20ea0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
20eb0 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
20ec0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
20ed0 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
20ee0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
20ef0 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
20f00 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
20f10 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
20f20 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
20f30 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
20f40 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
20f50 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
20f60 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
20f70 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
20f80 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
20f90 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
20fa0 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
20fb0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
20fc0 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
20fd0 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
20fe0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
20ff0 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
21000 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
21010 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
21020 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
21030 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
21040 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
21050 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
21060 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a   field..      **
21070 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78  .      ** The ex
21080 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c  pression is impl
21090 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e  emented using an
210a0 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65   OP_Param opcode
210b0 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a  . The p1.      *
210c0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  * parameter is s
210d0 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f  et to 0 for an o
210e0 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ld.rowid referen
210f0 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a  ce, or to (i+1).
21100 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65        ** to refe
21110 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f  rence another co
21120 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e  lumn of the old.
21130 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
21140 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  where .      ** 
21150 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  i is the index o
21160 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f  f the column. Fo
21170 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65  r a new.rowid re
21180 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20  ference, p1 is. 
21190 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28       ** set to (
211a0 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73  n+1), where n is
211b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
211c0 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70  olumns in each p
211d0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20  seudo-table..   
211e0 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65     ** For a refe
211f0 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68  rence to any oth
21200 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  er column in the
21210 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
21220 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a  ble, p1.      **
21230 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b   is set to (n+2+
21240 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20  i), where n and 
21250 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64  i are as defined
21260 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72   previously. For
21270 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c  .      ** exampl
21280 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
21290 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72  on which trigger
212a0 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65  s are being fire
212b0 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  d is.      ** de
212c0 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20  clared as:.     
212d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43   **.      **   C
212e0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
212f0 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20  , b);.      **. 
21300 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20       ** Then p1 
21310 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
21320 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
21330 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70   **.      **   p
21340 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==0   ->    old
21350 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33  .rowid     p1==3
21360 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77     ->    new.row
21370 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  id.      **   p1
21380 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==1   ->    old.
21390 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20  a         p1==4 
213a0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20    ->    new.a.  
213b0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20      **   p1==2  
213c0 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20   ->    old.b    
213d0 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20       p1==5   -> 
213e0 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a     new.b       .
213f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
21400 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78  able *pTab = pEx
21410 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
21420 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e  int p1 = pExpr->
21430 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e  iTable * (pTab->
21440 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45  nCol+1) + 1 + pE
21450 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20  xpr->iColumn;.. 
21460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
21470 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
21480 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21490 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
214a0 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
214b0 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e  n>=-1 && pExpr->
214c0 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43  iColumn<pTab->nC
214d0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ol );.      asse
214e0 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  rt( pTab->iPKey<
214f0 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 || pExpr->iCol
21500 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79  umn!=pTab->iPKey
21510 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21520 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70  ( p1>=0 && p1<(p
21530 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29  Tab->nCol*2+2) )
21540 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
21550 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21560 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67  _Param, p1, targ
21570 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
21580 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25  omment((v, "%s.%
21590 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20  s -> $%d",.     
215a0 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
215b0 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
215c0 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
215d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
215e0 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
215f0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70  >pTab->aCol[pExp
21600 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d  r->iColumn].zNam
21610 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67  e),.        targ
21620 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69  et.      ));..#i
21630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21640 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
21650 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
21660 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c   column has REAL
21670 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61   affinity, it ma
21680 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
21690 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20  tored as an.    
216a0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73    ** integer. Us
216b0 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  e OP_RealAffinit
216c0 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  y to make sure i
216d0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c  t is really real
216e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
216f0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
21700 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53   R-60985-57662 S
21710 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65  QLite will conve
21720 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63  rt the value bac
21730 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c  k to.      ** fl
21740 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65  oating point whe
21750 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20  n extracting it 
21760 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
21770 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
21780 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
21790 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62   .       && pTab
217a0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
217b0 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
217c0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
217d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
217e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
217f0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
21800 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b  finity, target);
21810 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21830 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
21840 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20  VECTOR: {.      
21850 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21860 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
21870 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
21880 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21890 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
218a0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
218b0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
218c0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
218d0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
218e0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
218f0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
21900 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
21910 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
21920 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
21930 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
21940 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
21950 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
21960 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
21970 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
21980 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
21990 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
219a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
219b0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
219c0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
219d0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
219e0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
219f0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
21a00 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
21a10 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
21a20 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
21a30 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
21a40 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
21a50 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
21a60 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
21a70 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
21a80 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
21a90 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
21aa0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
21ab0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
21ac0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
21ad0 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
21ae0 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
21af0 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
21b00 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
21b10 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
21b20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
21b30 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
21b40 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
21b50 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
21b60 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
21b70 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
21b80 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
21b90 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
21ba0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
21bb0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
21bc0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
21bd0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
21be0 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
21bf0 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
21c00 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
21c10 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
21c20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
21c30 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
21c40 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
21c50 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
21c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
21c70 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
21c80 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
21c90 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
21ca0 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
21cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
21cc0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
21cd0 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
21ce0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d00 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
21d10 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
21d20 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
21d30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21d50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21d60 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
21d70 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
21d80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
21d90 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
21da0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
21db0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
21dc0 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
21dd0 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
21de0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
21df0 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
21e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21e10 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
21e20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
21e30 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e50 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
21e60 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
21e70 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e90 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
21ea0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
21eb0 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41   B) */.      VVA
21ec0 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68  _ONLY( int iCach
21ed0 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  eLevel = pParse-
21ee0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a  >iCacheLevel; ).
21ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
21f00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21f10 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
21f20 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
21f30 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
21f40 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
21f50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
21f60 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
21f70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
21f80 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
21f90 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
21fa0 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
21fb0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
21fc0 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
21fd0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21fe0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
21ff0 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
22000 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
22010 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
22020 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22030 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
22040 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
22050 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
22060 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  mpX, exprCodeVec
22070 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d  tor(pParse, &tem
22080 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
22090 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
220a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
220b0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
220c0 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
220d0 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
220e0 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
220f0 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
22100 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
22110 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
22120 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
22130 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
22140 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
22150 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
22160 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
22170 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
22180 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
22190 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
221a0 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
221b0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
221c0 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
221d0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
221e0 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
221f0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
22200 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
22210 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
22220 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
22230 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
22240 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
22250 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
22260 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
22270 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
22280 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22290 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
222a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
222b0 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
222c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
222d0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
222e0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
222f0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
22300 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
22310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22320 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
22330 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
22340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22350 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
22360 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
22370 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
22380 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
22390 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
223a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
223b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
223c0 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
223d0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
223e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
223f0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
22400 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
22410 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
22420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22430 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
22440 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
22450 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
22460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22470 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
22480 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
22490 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
224a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
224b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
224c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
224d0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
224e0 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
224f0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
22500 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22510 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
22520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22530 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
22540 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
22550 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
22560 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22570 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
22580 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
22590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
225a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
225b0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
225c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
225d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
225e0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
225f0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
22600 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20  >nErr>0 .       
22610 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69      || pParse->i
22620 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63  CacheLevel==iCac
22630 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20  heLevel );.     
22640 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22650 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
22660 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
22670 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
22680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
22690 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
226a0 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
226b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
226c0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c  affinity==OE_Rol
226d0 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20  lback .         
226e0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
226f0 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  nity==OE_Abort. 
22700 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
22710 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
22720 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20  _Fail.          
22730 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
22740 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  ity==OE_Ignore. 
22750 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
22760 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
22770 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
22780 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22790 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
227c0 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
227d0 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
227e0 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
227f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
22800 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
22810 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
22820 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
22830 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
22840 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
22850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
22860 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22870 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
22880 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ue) );.      if(
22890 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
228a0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
228b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
228c0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
228d0 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74        v, OP_Halt
228e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f  , SQLITE_OK, OE_
228f0 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72  Ignore, 0, pExpr
22900 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20  ->u.zToken,0);. 
22910 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
22920 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
22930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22940 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
22950 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
22960 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
22970 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
229a0 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
229b0 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  oken, 0, 0);.   
229c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
229d0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
229e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
229f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
22a00 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
22a10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
22a20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
22a30 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
22a40 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
22a50 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68  ** Factor out th
22a60 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69  e code of the gi
22a70 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
22a80 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
22a90 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   time..**.** If 
22aa0 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20  regDest>=0 then 
22ab0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
22ac0 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ways stored in t
22ad0 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64  hat register and
22ae0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69   the.** result i
22af0 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20  s not reusable. 
22b00 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68   If regDest<0 th
22b10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
22b20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73  is free to .** s
22b30 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77  tore the value w
22b40 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74  hereever it want
22b50 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
22b60 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
22b70 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f  ssion .** is sto
22b80 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  red is returned.
22b90 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30    When regDest<0
22ba0 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20  , two identical 
22bb0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c  expressions will
22bc0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20  .** code to the 
22bd0 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  same register..*
22be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
22bf0 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50  rCodeAtInit(.  P
22c00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22c10 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22c20 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
22c30 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
22c40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
22c50 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44  code when the VD
22c60 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a  BE initializes *
22c70 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20  /.  int regDest 
22c80 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
22c90 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
22ca0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
22cb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
22cc0 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
22cd0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
22ce0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
22cf0 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66  pConstExpr;.  if
22d00 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70  ( regDest<0 && p
22d10 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
22d20 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
22d30 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  tem;.    int i;.
22d40 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
22d50 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
22d60 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
22d70 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  -){.      if( pI
22d80 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26  tem->reusable &&
22d90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22da0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
22db0 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b  ,pExpr,-1)==0 ){
22dc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22dd0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
22de0 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  xprReg;.      }.
22df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
22e00 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
22e10 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
22e20 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Expr, 0);.  p = 
22e30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
22e40 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
22e50 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   pExpr);.  if( p
22e60 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20   ){.     struct 
22e70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22e80 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
22e90 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70  nExpr-1];.     p
22ea0 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d  Item->reusable =
22eb0 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20   regDest<0;.    
22ec0 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29   if( regDest<0 )
22ed0 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61   regDest = ++pPa
22ee0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22ef0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
22f00 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
22f10 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
22f20 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a  pConstExpr = p;.
22f30 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74    return regDest
22f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
22f50 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
22f60 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
22f70 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
22f80 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
22f90 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
22fa0 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
22fb0 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
22fc0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
22fd0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
22fe0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
22ff0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
23000 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
23010 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
23020 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
23030 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
23040 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
23050 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
23060 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
23070 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
23080 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
23090 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
230a0 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
230b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
230c0 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
230d0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
230e0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
230f0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
23100 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
23110 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
23120 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
23130 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
23140 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
23150 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
23160 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
23170 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23180 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
23190 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
231a0 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
231b0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
231c0 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
231d0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
231e0 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
231f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
23200 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
23210 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
23220 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
23230 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   ){.    *pReg  =
23240 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c   0;.    r2 = sql
23250 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
23260 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
23270 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
23280 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
23290 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
232a0 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
232b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
232c0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
232d0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
232e0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
232f0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
23300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23310 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23320 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
23330 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
23340 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
23350 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
23360 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23370 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
23380 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
23390 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
233a0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
233b0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
233c0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
233d0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
233e0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
233f0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
23400 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23410 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
23420 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23430 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
23440 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
23450 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
23460 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
23470 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
23480 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
23490 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
234a0 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
234b0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
234c0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
234d0 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
234e0 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
234f0 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
23500 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23510 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23520 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
23530 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
23540 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
23550 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
23560 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
23570 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
23580 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
23590 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
235a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
235b0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
235c0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
235d0 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
235e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
235f0 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
23600 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
23610 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
23620 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
23630 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
23640 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
23650 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
23660 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
23670 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
23680 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
23690 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
236a0 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
236b0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
236c0 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
236d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
236e0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
236f0 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
23700 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23710 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
23720 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
23730 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
23740 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
23750 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
23760 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
23770 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
23780 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
23790 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
237a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
237b0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
237c0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
237d0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
237e0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
237f0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
23800 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
23810 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
23820 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
23830 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
23840 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
23850 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
23860 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
23870 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
23880 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
23890 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
238a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
238b0 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
238c0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
238d0 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
238e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
238f0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
23900 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
23910 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
23920 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
23930 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
23940 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23950 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
23960 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23980 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23990 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
239a0 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
239b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
239c0 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
239d0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
239e0 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
239f0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
23a00 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
23a10 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
23a20 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
23a30 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
23a40 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
23a50 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
23a60 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
23a70 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
23a80 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
23a90 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
23aa0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
23ab0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
23ac0 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
23ad0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23ae0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
23af0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
23b00 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
23b10 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
23b20 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
23b30 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
23b40 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
23b50 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
23b60 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
23b70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
23b80 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
23b90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23ba0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
23bb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
23bc0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
23bd0 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
23be0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
23bf0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
23c00 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
23c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
23c20 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
23c30 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
23c40 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
23c50 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
23c60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23c70 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
23c80 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
23c90 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
23ca0 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
23cb0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
23cc0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
23cd0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
23ce0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
23cf0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
23d00 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
23d10 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
23d20 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
23d30 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
23d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
23d50 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
23d60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
23d70 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
23d80 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
23d90 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
23da0 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
23db0 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
23dc0 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
23dd0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
23de0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
23df0 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
23e00 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
23e10 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
23e20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
23e30 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
23e40 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
23e50 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
23e60 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
23e70 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
23e80 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
23e90 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
23ea0 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
23eb0 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
23ec0 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
23ed0 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
23ee0 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
23ef0 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
23f00 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
23f10 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
23f20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23f30 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
23f40 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23f50 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
23f60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
23f70 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
23f80 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23f90 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
23fa0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
23fb0 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
23fc0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
23fd0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
23fe0 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
23ff0 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
24000 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
24010 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
24020 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
24030 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
24040 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
24050 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
24060 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
24070 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
24080 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
24090 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
240a0 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
240b0 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
240c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
240d0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
240e0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
240f0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
24100 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24110 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
24120 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
24130 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
24140 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
24150 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
24160 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
24170 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
24180 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
24190 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
241a0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
241b0 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
241c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
241d0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
241e0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
241f0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
24200 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
24210 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
24220 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
24230 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
24240 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
24250 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d  F ){.        i--
24260 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ;.        n--;. 
24270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24290 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
242a0 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72   j+srcReg-1, tar
242b0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  get+i);.      }.
242c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
242d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
242e0 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26  EL_FACTOR)!=0 &&
242f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
24300 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
24310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24320 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24330 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24340 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
24350 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
24360 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
24370 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24380 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
24390 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
243a0 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
243b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
243c0 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
243d0 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
243e0 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
243f0 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
24400 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
24410 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
24420 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
24430 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
24440 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
24450 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
24460 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
24470 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
24480 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
24490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
244a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
244b0 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
244c0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
244d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
244e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
244f0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
24500 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24510 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
24520 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
24530 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
24540 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
24550 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
24560 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
24570 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
24580 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
24590 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
245a0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
245b0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
245c0 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
245d0 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
245e0 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
245f0 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
24600 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
24610 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
24620 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
24630 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
24640 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
24650 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
24660 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
24670 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
24680 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24690 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
246a0 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
246b0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
246c0 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
246d0 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
246e0 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
246f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
24700 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
24710 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
24720 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
24730 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
24740 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
24750 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
24760 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
24770 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
24780 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
24790 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
247a0 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
247b0 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
247c0 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
247d0 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
247e0 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
247f0 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
24800 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
24810 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
24820 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
24830 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
24840 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
24850 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
24860 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
24870 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
24880 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
24890 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
248a0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
248b0 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
248c0 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
248d0 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
248e0 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
248f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
24900 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
24910 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
24920 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a  e register */...
24930 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65    memset(&compLe
24940 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ft, 0, sizeof(Ex
24950 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
24960 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69  compRight, 0, si
24970 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
24980 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20  emset(&exprAnd, 
24990 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
249a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
249b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
249c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
249d0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
249e0 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
249f0 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
24a00 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
24a10 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
24a20 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
24a30 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
24a40 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
24a50 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
24a60 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
24a70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
24a80 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
24a90 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
24aa0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
24ab0 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
24ac0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
24ad0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
24ae0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
24af0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
24b00 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
24b10 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
24b20 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
24b30 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
24b40 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
24b50 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20  if( xJump ){.   
24b60 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
24b70 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
24b80 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
24b90 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  lse{.    /* Mark
24ba0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24bb0 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68  is being from th
24bc0 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
24bd0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20  ause of a join. 
24be0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
24bf0 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
24c00 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e  eTarget() routin
24c10 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
24c20 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a  pt to move.    *
24c30 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61  * it into the Pa
24c40 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c  rse.pConstExpr l
24c50 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  ist.  We should 
24c60 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f  use a new bit fo
24c70 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66  r this,.    ** f
24c80 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20  or clarity, but 
24c90 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69  we are out of bi
24ca0 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66  ts in the Expr.f
24cb0 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65  lags field so we
24cc0 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20  .    ** have to 
24cd0 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f  reuse the EP_Fro
24ce0 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d  mJoin bit.  Bumm
24cf0 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72 58  er. */.    exprX
24d00 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f  .flags |= EP_Fro
24d10 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  mJoin;.    sqlit
24d20 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24d30 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
24d40 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20  d, dest);.  }.  
24d50 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24d60 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
24d70 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
24d80 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
24d90 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
24da0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24db0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24dc0 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
24dd0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
24de0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
24df0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
24e00 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
24e10 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
24e20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
24e30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24e40 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
24e50 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
24e60 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
24e70 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
24e80 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24e90 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
24ea0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
24eb0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
24ec0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24ed0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24ee0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
24ef0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
24f00 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
24f10 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24f20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24f30 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
24f40 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
24f50 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24f60 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24f70 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
24f80 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
24f90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
24fa0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24fb0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
24fc0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
24fd0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
24fe0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
24ff0 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a  se( xJump==0 );.
25000 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
25010 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
25020 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
25030 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
25040 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
25050 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
25060 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
25070 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
25080 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
25090 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
250a0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
250b0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
250c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
250d0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
250e0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
250f0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
25100 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
25110 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
25120 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
25130 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
25140 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
25150 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
25160 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
25170 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
25180 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
25190 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
251a0 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
251b0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
251c0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
251d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
251e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
251f0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
25200 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
25210 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
25220 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
25230 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
25240 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
25250 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
25260 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
25270 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
25280 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
25290 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
252a0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
252b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
252c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
252d0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
252e0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
252f0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
25300 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
25310 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
25320 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
25330 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
25340 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
25350 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
25360 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
25370 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25380 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
25390 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
253a0 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
253b0 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
253c0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
253d0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
253e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
253f0 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
25400 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
25410 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
25420 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
25430 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
25440 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
25450 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
25460 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25470 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
25480 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
25490 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
254a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
254b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
254c0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
254d0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
254e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
254f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25500 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
25510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25520 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
25530 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
25540 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25560 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
25570 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
25580 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25590 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
255a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
255b0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
255c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
255d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
255e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
255f0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
25600 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25610 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25630 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
25640 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
25650 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
25660 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
25670 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
25680 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
25690 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
256a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
256b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
256c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
256d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
256e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
256f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25700 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
25710 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25720 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25730 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
25740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
25750 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
25760 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
25770 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
25780 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
25790 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
257a0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
257b0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
257c0 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
257d0 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
257e0 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
257f0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
25800 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
25810 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
25820 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
25830 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
25840 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
25850 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
25860 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
25870 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
25880 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
25890 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
258a0 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
258b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
258c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
258d0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
258e0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
258f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25900 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
25910 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
25920 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
25930 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
25940 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
25950 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
25960 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25970 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
25980 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
25990 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
259a0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
259b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
259c0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
259d0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
259e0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
259f0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
25a00 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
25a10 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
25a20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
25a30 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
25a40 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
25a50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25a60 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
25a70 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
25a80 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
25a90 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
25aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
25ab0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
25ac0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
25ad0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
25ae0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
25af0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
25b00 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
25b10 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
25b20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25b30 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
25b40 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
25b50 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
25b60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
25b70 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
25b80 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
25b90 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
25ba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
25bb0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
25bc0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
25bd0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25be0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
25bf0 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
25c00 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
25c10 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
25c20 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
25c30 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
25c40 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
25c50 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
25c60 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
25c70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
25c80 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
25c90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25ca0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25cb0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
25cc0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
25cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
25ce0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
25cf0 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
25d00 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
25d10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
25d20 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
25d30 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
25d40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
25d50 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
25d60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
25d70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
25d80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
25d90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
25da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25db0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
25dc0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25dd0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
25de0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
25df0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25e00 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
25e10 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
25e20 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
25e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25e40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25e50 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
25e60 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
25e70 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25e80 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
25e90 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
25ea0 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33  r, dest, sqlite3
25eb0 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70  ExprIfTrue, jump
25ec0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
25ed0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
25ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25ef0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
25f00 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
25f10 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
25f20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
25f30 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
25f40 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
25f50 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
25f60 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
25f70 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
25f80 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
25f90 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
25fa0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
25fb0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
25fc0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
25fd0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
25fe0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
25ff0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
26000 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
26010 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26020 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
26030 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20   default_expr:. 
26040 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
26050 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
26060 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26070 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
26080 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
26090 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
260a0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
260b0 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a        /* No-op *
260c0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
260d0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
260e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
260f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
26100 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26120 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
26130 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
26140 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
26150 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
26160 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
26170 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
26180 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
26190 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
261a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
261b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
261c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
261d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
261e0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
261f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
26200 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
26210 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
26220 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
26230 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
26240 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
26250 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
26260 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
26270 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
26280 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26290 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
262a0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
262b0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
262c0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
262d0 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
262e0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
262f0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
26300 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
26310 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
26320 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
26330 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
26340 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
26350 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
26360 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
26370 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
26380 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26390 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
263a0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
263b0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
263c0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
263d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
263e0 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
263f0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
26400 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
26410 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
26420 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
26430 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
26440 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
26450 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
26460 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
26470 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
26480 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
26490 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
264a0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
264b0 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65  pExpr==0 )    re
264c0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
264d0 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
264e0 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
264f0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
26500 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
26510 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
26520 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
26530 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
26540 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
26550 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
26560 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
26570 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
26580 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
26590 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
265a0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
265b0 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
265c0 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
265d0 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
265e0 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
265f0 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
26600 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
26610 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
26630 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
26640 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
26650 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
26660 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
26670 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
26680 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
26690 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
266a0 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
266b0 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
266c0 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
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 20 61 72 65 20 61 72 72  onstants are arr
266f0 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
26700 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
26710 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
26720 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
26730 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
26740 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
26750 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
26760 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
26770 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
26780 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
26790 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
267a0 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
267b0 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
267c0 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
267d0 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
267e0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
267f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
26800 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
26810 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
26820 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
26830 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
26840 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
26850 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
26860 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
26870 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
26880 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
26890 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
268a0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
268b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
268c0 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
268d0 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
268e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
268f0 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
26900 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
26910 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
26920 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
26930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
26940 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
26950 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
26960 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
26970 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
26980 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
26990 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
269a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
269b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
269c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
269d0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
269e0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
269f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26a00 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
26a10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26a20 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26a30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
26a40 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26a60 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
26a70 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
26a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26a90 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
26aa0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
26ab0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
26ac0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26ad0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26af0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26b00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26b10 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
26b20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26b30 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
26b40 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
26b50 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
26b60 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26b70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26b80 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
26b90 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26ba0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
26bb0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
26bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26bd0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
26be0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
26bf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26c00 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
26c10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
26c20 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
26c30 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26c40 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
26c50 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
26c60 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26c70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26c80 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
26c90 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
26ca0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
26cb0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
26cc0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
26cd0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
26ce0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
26cf0 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
26d00 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
26d10 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
26d20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
26d30 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
26d40 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
26d50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
26d60 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
26d70 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
26d80 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
26d90 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
26da0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
26db0 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
26dc0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
26dd0 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
26de0 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
26df0 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
26e00 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26e10 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
26e20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26e30 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26e40 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
26e50 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
26e60 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
26e70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26e80 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
26e90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
26ea0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
26eb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26ec0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
26ed0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
26ee0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
26ef0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26f00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26f10 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
26f20 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
26f30 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
26f40 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
26f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26f60 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
26f70 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
26f80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
26f90 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
26fa0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
26fb0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
26fc0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
26fd0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26fe0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
26ff0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
27000 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
27010 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
27020 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27030 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
27040 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
27050 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
27060 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
27070 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27080 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
27090 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
270a0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
270b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
270c0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
270d0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
270e0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
270f0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
27100 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
27110 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
27120 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27130 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
27140 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
27150 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27160 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27170 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27180 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
27190 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
271a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
271b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
271c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
271d0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
271e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
271f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
27200 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
27210 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
27220 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
27230 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27240 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27250 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
27260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27270 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
27280 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
27290 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
272a0 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43  SNULL );   VdbeC
272b0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
272c0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
272d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
272e0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20  =TK_NOTNULL );  
272f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27300 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
27310 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27320 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
27330 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27340 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27350 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
27360 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27370 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27380 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
27390 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
273a0 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45  , dest, sqlite3E
273b0 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70  xprIfFalse, jump
273c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
273d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
273e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
273f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
27400 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
27410 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
27420 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27430 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
27440 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
27450 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
27460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
27470 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
27480 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27490 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
274a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
274b0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
274c0 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
274d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
274e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
274f0 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
27500 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
27510 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
27520 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
27530 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
27540 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66  _expr: .      if
27550 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
27560 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
27570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
27580 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
27590 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
275a0 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
275b0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
275c0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
275d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
275e0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
275f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27600 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
27610 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
27620 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27630 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
27640 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
27650 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
27660 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
27670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27680 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27690 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
276a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
276b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
276c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
276d0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
276e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
276f0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
27700 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
27710 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
27720 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
27730 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
27740 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74  IfFalse() except
27750 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20   that a copy is 
27760 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65  made of pExpr be
27770 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e  fore.** code gen
27780 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61  eration, and tha
27790 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65  t copy is delete
277a0 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e  d after code gen
277b0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a  eration. This.**
277c0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
277d0 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72  e original pExpr
277e0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
277f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
27800 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72  prIfFalseDup(Par
27810 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
27820 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
27830 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  t,int jumpIfNull
27840 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
27850 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
27860 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73   Expr *pCopy = s
27870 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
27880 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
27890 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
278a0 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  led==0 ){.    sq
278b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
278c0 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20  (pParse, pCopy, 
278d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
278e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
278f0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
27900 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Copy);.}.../*.**
27910 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
27920 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
27930 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
27940 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
27950 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
27960 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
27970 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
27980 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
27990 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
279a0 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
279b0 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
279c0 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
279d0 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
279e0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
279f0 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
27a00 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
27a10 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
27a20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
27a30 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
27a40 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
27a50 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
27a60 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
27a70 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
27a80 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
27a90 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
27aa0 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
27ab0 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
27ac0 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
27ad0 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
27ae0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
27af0 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
27b00 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
27b10 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
27b20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
27b30 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
27b40 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
27b50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
27b60 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
27b70 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
27b80 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
27b90 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
27ba0 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
27bb0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
27bc0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
27bd0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
27be0 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
27bf0 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
27c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
27c10 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
27c20 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
27c30 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
27c40 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
27c50 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
27c60 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
27c70 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
27c80 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
27c90 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
27ca0 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
27cb0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
27cc0 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
27cd0 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
27ce0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
27cf0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
27d00 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
27d10 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
27d20 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
27d30 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
27d40 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
27d50 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
27d60 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
27d70 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
27d80 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
27d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
27da0 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
27db0 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
27dc0 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
27dd0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
27de0 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
27df0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
27e00 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
27e10 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
27e20 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
27e30 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
27e40 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
27e50 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
27e60 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
27e70 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
27e80 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
27e90 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
27ea0 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
27eb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
27ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
27ed0 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
27ee0 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
27ef0 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
27f00 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
27f10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27f20 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
27f30 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
27f40 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
27f50 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f   }.    if( pB->o
27f60 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
27f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
27f80 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66  are(pA, pB->pLef
27f90 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  t, iTab)<2 ){.  
27fa0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
27fb0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
27fc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
27fd0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
27fe0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
27ff0 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
28000 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
28010 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
28020 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
28030 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
28040 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
28050 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
28060 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
28070 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
28080 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
28090 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
280a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
280b0 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
280c0 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d  E ? 1 : 2;.    }
280d0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
280e0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
280f0 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
28100 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
28110 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
28120 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
28130 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
28140 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20  enOnly)==0) ){. 
28150 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
28160 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
28170 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
28180 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28190 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
281a0 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
281b0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
281c0 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
281d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
281e0 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
281f0 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
28200 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
28210 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
28220 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
28230 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
28240 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
28250 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  2;.    if( ALWAY
28260 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
28270 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d   & EP_Reduced)==
28280 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  0) && pA->op!=TK
28290 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20  _STRING ){.     
282a0 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
282b0 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
282c0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
282d0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
282e0 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20  pB->iTable .    
282f0 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c     && (pA->iTabl
28300 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52  e!=iTab || NEVER
28310 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29  (pB->iTable>=0))
28320 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
28330 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28340 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
28350 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
28360 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
28370 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
28380 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
28390 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
283a0 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
283b0 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
283c0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
283d0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
283e0 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
283f0 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
28400 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
28410 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
28420 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
28430 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
28440 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
28450 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
28460 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
28470 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20   for equivalent 
28480 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a  ExprLists.  The.
28490 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65  ** only conseque
284a0 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61  nce will be disa
284b0 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
284c0 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  ns.  But this ro
284d0 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65  utine.** must ne
284e0 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20  ver return 0 if 
284f0 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  the two ExprList
28500 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66   objects are dif
28510 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20  ferent, or.** a 
28520 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  malfunction will
28530 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54   result..**.** T
28540 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73  wo NULL pointers
28550 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
28560 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20  to be the same. 
28570 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   But a NULL poin
28580 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69  ter.** always di
28590 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e  ffers from a non
285a0 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a  -NULL pointer..*
285b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
285c0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70  rListCompare(Exp
285d0 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c  rList *pA, ExprL
285e0 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  ist *pB, int iTa
285f0 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
28600 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
28610 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
28620 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
28630 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
28640 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
28650 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
28660 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
28670 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
28680 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
28690 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
286a0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
286b0 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
286c0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
286d0 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
286e0 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
286f0 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
28700 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
28710 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
28720 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
28730 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
28740 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
28750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28760 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
28770 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
28780 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
28790 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
287a0 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
287b0 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
287c0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
287d0 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
287e0 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
287f0 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
28800 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
28810 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
28820 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
28830 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
28840 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
28850 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
28860 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
28870 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
28880 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
28890 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
288a0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
288b0 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
288c0 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
288d0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
288e0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
288f0 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
28900 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
28910 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
28920 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
28930 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
28940 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
28950 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
28960 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
28970 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
28980 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
28990 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
289a0 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
289b0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
289c0 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
289d0 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
289e0 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
289f0 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
28a00 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
28a10 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68  y iTab..**.** Wh
28a20 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
28a30 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
28a40 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
28a50 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
28a60 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
28a70 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
28a80 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
28a90 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
28aa0 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
28ab0 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
28ac0 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
28ad0 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
28ae0 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
28af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28b00 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
28b10 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
28b20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
28b30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
28b40 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70  prCompare(pE1, p
28b50 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
28b60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28b70 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
28b80 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
28b90 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
28ba0 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
28bb0 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
28bc0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
28bd0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
28be0 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  pr(pE1, pE2->pRi
28bf0 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
28c00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
28c10 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
28c20 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26  p==TK_NOTNULL &&
28c30 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e   pE1->op!=TK_ISN
28c40 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
28c50 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70  TK_IS ){.    Exp
28c60 72 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45  r *pX = sqlite3E
28c70 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
28c80 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  E1->pLeft);.    
28c90 74 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 45  testcase( pX!=pE
28ca0 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  1->pLeft );.    
28cb0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
28cc0 6f 6d 70 61 72 65 28 70 58 2c 20 70 45 32 2d 3e  ompare(pX, pE2->
28cd0 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 20  pLeft, iTab)==0 
28ce0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
28cf0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28d00 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
28d10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
28d20 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
28d30 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
28d40 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74  walker.** to det
28d50 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70  ermine if an exp
28d60 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65  ression can be e
28d70 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65  valuated by refe
28d80 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20  rence to the.** 
28d90 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68  index only, with
28da0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  out having to do
28db0 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68   a search for th
28dc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
28dd0 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
28de0 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49   The IdxCover.pI
28df0 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20  dx field is the 
28e00 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72  index.  IdxCover
28e10 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20  .iCur.** is the 
28e20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
28e30 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
28e40 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64  IdxCover {.  Ind
28e50 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a  ex *pIdx;     /*
28e60 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
28e70 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65   tested for cove
28e80 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  rage */.  int iC
28e90 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ur;        /* Cu
28ea0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
28eb0 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73  the table corres
28ec0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69  ponding to the i
28ed0 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ndex */.};../*.*
28ee0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
28ef0 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65  f there are refe
28f00 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
28f10 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70  s in table .** p
28f20 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
28f30 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65  ver->iCur can be
28f40 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
28f50 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57   the index.** pW
28f60 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
28f70 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  er->pIdx..*/.sta
28f80 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43  tic int exprIdxC
28f90 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  over(Walker *pWa
28fa0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
28fb0 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
28fc0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
28fd0 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
28fe0 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  le==pWalker->u.p
28ff0 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20  IdxCover->iCur. 
29000 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75    && sqlite3Colu
29010 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65  mnOfIndex(pWalke
29020 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
29030 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pIdx, pExpr->iCo
29040 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20  lumn)<0.  ){.   
29050 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
29060 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
29070 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
29080 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
29090 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
290a0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69  etermine if an i
290b0 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62  ndex pIdx on tab
290c0 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
290d0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c  Cur contains wil
290e0 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  l.** the express
290f0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75  ion pExpr.  Retu
29100 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
29110 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20  ndex does cover 
29120 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
29130 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  n and false if t
29140 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
29150 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74  ion references t
29160 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  able columns.** 
29170 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75  that are not fou
29180 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nd in the index 
29190 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69  pIdx..**.** An i
291a0 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e  ndex covering an
291b0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e   expression mean
291c0 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  s that the expre
291d0 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20  ssion can be.** 
291e0 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20  evaluated using 
291f0 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61  only the index a
29200 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  nd without havin
29210 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a  g to lookup the.
29220 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
29230 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f   table entry..*/
29240 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
29250 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a  CoveredByIndex(.
29260 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
29270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
29280 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
29290 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
292a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
292b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
292c0 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
292d0 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49  ing table */.  I
292e0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
292f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
29300 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73  that might be us
29310 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
29320 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  */.){.  Walker w
29330 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f  ;.  struct IdxCo
29340 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73  ver xcov;.  mems
29350 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
29360 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75  (w));.  xcov.iCu
29370 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76  r = iCur;.  xcov
29380 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
29390 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
293a0 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a  = exprIdxCover;.
293b0 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20    w.u.pIdxCover 
293c0 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74  = &xcov;.  sqlit
293d0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
293e0 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  Expr);.  return 
293f0 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a  !w.eCode;.}.../*
29400 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
29410 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
29420 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
29430 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
29440 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e  alker.** to coun
29450 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  t references to 
29460 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
29470 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f   the arguments o
29480 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61  f an .** aggrega
29490 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20  te function, in 
294a0 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
294b0 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  nt the.** sqlite
294c0 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63  3FunctionThisSrc
294d0 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
294e0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b  truct SrcCount {
294f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
29500 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69  ;   /* One parti
29510 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73  cular FROM claus
29520 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75  e in a nested qu
29530 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68  ery */.  int nTh
29540 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  is;       /* Num
29550 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
29560 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
29570 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  pSrcList */.  in
29580 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f  t nOther;      /
29590 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
295a0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
295b0 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20  s in other FROM 
295c0 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  clauses */.};../
295d0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
295e0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
295f0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a  ces to columns..
29600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
29610 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65  prSrcCount(Walke
29620 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
29630 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
29640 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68  he NEVER() on th
29650 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73  e second term is
29660 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33   because sqlite3
29670 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
29680 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c  Src().  ** is al
29690 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ways called befo
296a0 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  re sqlite3ExprAn
296b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
296c0 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a  ) and so the.  *
296d0 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76  * TK_COLUMNs hav
296e0 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
296f0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
29700 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66  _AGG_COLUMN.  If
29710 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  .  ** sqlite3Fun
29720 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
29730 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65  () is used diffe
29740 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75  rently in the fu
29750 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e  ture, the.  ** N
29760 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64  EVER() will need
29770 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20   to be removed. 
29780 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
29790 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
297a0 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70   NEVER(pExpr->op
297b0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
297c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
297d0 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75     struct SrcCou
297e0 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  nt *p = pWalker-
297f0 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20  >u.pSrcCount;.  
29800 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
29810 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
29820 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f  nt nSrc = pSrc ?
29830 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b   pSrc->nSrc : 0;
29840 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29850 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
29860 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
29870 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e  ble==pSrc->a[i].
29880 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
29890 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
298a0 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  <nSrc ){.      p
298b0 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
298c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
298d0 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
298e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
298f0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
29900 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
29910 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
29920 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
29930 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
29940 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
29950 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
29960 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
29970 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
29980 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
29990 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
299a0 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
299b0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
299c0 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
299d0 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
299e0 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
299f0 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
29a00 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
29a10 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
29a20 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
29a30 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
29a40 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
29a50 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
29a60 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
29a70 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
29a80 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
29a90 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
29aa0 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65  CTION );.  memse
29ab0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
29ac0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
29ad0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
29ae0 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72  Count;.  w.u.pSr
29af0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
29b00 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
29b10 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
29b20 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
29b30 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
29b40 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
29b50 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
29b60 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
29b70 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
29b80 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
29b90 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
29ba0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
29bb0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
29bc0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
29bd0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
29be0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
29bf0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
29c00 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
29c10 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
29c20 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
29c30 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
29c40 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
29c50 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
29c60 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
29c70 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
29c80 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
29c90 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
29ca0 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
29cb0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
29cc0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
29cd0 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
29ce0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
29cf0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
29d00 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
29d10 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
29d20 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
29d30 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
29d40 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
29d50 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
29d60 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
29d70 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
29d80 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
29d90 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
29da0 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
29db0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
29dc0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
29dd0 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
29de0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
29df0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
29e00 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
29e10 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
29e20 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
29e30 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
29e40 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
29e50 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
29e60 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
29e70 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
29e80 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
29e90 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
29ea0 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
29eb0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
29ec0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
29ed0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
29ee0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
29ef0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
29f00 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
29f10 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
29f20 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
29f30 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
29f40 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
29f50 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
29f60 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
29f70 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
29f80 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
29f90 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
29fa0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
29fb0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
29fc0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
29fd0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
29fe0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
29ff0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
2a000 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2a010 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
2a020 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2a030 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
2a040 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2a050 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2a060 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2a070 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2a080 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
2a090 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2a0a0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
2a0b0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
2a0c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2a0d0 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
2a0e0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2a0f0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2a100 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
2a110 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
2a120 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
2a130 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2a140 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
2a150 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2a160 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2a170 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2a180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2a190 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2a1a0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
2a1b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2a1c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2a1d0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2a1e0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2a1f0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2a200 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2a210 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
2a220 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2a230 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2a240 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
2a250 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
2a260 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
2a270 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
2a280 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a290 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2a2a0 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
2a2b0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2a2c0 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
2a2d0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
2a2e0 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
2a2f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
2a300 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
2a310 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
2a320 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
2a330 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2a340 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2a350 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
2a360 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
2a370 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
2a380 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2a390 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2a3a0 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a3c0 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
2a3d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a3f0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2a400 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2a410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a420 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a450 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
2a460 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2a480 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
2a490 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
2a4a0 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
2a4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a4d0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
2a4e0 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
2a4f0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2a500 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
2a510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a520 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
2a530 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
2a540 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a550 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
2a560 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2a570 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2a580 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
2a590 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
2a5a0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2a5b0 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2a5d0 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
2a5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2a5f0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
2a600 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
2a610 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
2a620 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2a630 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
2a640 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
2a650 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
2a660 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2a670 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
2a680 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
2a6a0 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2a6c0 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
2a6d0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2a6f0 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
2a700 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2a710 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
2a720 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
2a730 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
2a740 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a760 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
2a770 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
2a780 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a790 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2a7a0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a810 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
2a820 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
2a830 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a840 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2a850 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
2a860 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
2a870 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
2a8a0 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
2a8b0 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
2a8c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
2a8d0 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
2a8e0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
2a8f0 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
2a900 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
2a910 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
2a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2a930 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
2a940 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
2a950 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
2a960 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
2a970 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
2a980 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
2a990 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2a9b0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2a9c0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
2a9d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a9e0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
2a9f0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
2aa00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
2aa10 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
2aa20 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
2aa30 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2aa40 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
2aa50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2aa60 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
2aa70 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
2aa80 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
2aa90 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
2aaa0 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
2aab0 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
2aac0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2aad0 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
2aae0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
2aaf0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
2ab00 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
2ab10 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
2ab20 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
2ab30 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2ab40 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
2ab50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2ab60 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2ab70 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
2ab80 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
2ab90 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
2aba0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
2abb0 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
2abc0 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
2abd0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
2abe0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
2abf0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2ac00 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
2ac10 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
2ac20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
2ac30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2ac40 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2ac50 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2ac60 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2ac70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
2ac80 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
2ac90 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2aca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2acb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2acc0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
2acd0 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
2ace0 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
2acf0 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
2ad00 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
2ad10 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
2ad20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2ad30 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
2ad40 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
2ad50 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
2ad60 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
2ad70 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2ad80 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
2ad90 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
2ada0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2adb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2adc0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2add0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
2ade0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
2adf0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
2ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2ae10 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
2ae20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
2ae30 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
2ae40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2ae50 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ae60 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ae70 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
2ae80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2ae90 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
2aea0 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
2aeb0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
2aec0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2aed0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
2aee0 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20  zToken, .       
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2af00 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
2af10 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2af20 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
2af30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2af40 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
2af50 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2af70 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2af80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2af90 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2afa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2afb0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2afc0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
2afd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2afe0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2aff0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
2b000 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
2b010 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
2b020 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
2b030 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
2b040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2b050 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2b060 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2b070 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2b080 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
2b090 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2b0a0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2b0b0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2b0c0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
2b0d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2b0e0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2b0f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
2b100 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2b110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b120 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
2b130 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2b140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2b150 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2b160 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
2b170 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2b180 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
2b190 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2b1a0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2b1b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57  SED_PARAMETER(pW
2b1c0 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44  alker);.  UNUSED
2b1d0 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2b1e0 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  ct);.  return WR
2b1f0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2b200 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
2b210 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2b220 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
2b230 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2b240 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
2b250 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
2b260 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
2b270 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  AggInfo object t
2b280 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  hat pNC->pAggInf
2b290 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20  o.** points to. 
2b2a0 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   Additional entr
2b2b0 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20  ies are made on 
2b2c0 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65  the AggInfo obje
2b2d0 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61  ct as.** necessa
2b2e0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
2b2f0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
2b300 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
2b310 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
2b320 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
2b330 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
2b340 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
2b350 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
2b360 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2b370 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
2b380 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2b390 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
2b3a0 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
2b3b0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
2b3c0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2b3d0 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
2b3e0 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c  regate;.  w.xSel
2b3f0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  ectCallback = an
2b400 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2b410 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70  nSelect;.  w.u.p
2b420 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65  NC = pNC;.  asse
2b430 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
2b440 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  t!=0 );.  sqlite
2b450 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2b460 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  xpr);.}../*.** C
2b470 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
2b480 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b490 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
2b4a0 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
2b4b0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2b4c0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
2b4d0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
2b4e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2b4f0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
2b500 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
2b510 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
2b520 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2b530 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
2b540 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
2b550 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
2b560 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2b570 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
2b580 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
2b590 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
2b5a0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
2b5b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2b5c0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2b5d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b5e0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2b5f0 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
2b600 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2b610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2b620 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  te a single new 
2b630 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65  register for use
2b640 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e   to hold some in
2b650 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
2b660 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2b670 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
2b680 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
2b690 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
2b6a0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
2b6b0 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
2b6c0 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
2b6d0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2b6e0 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d  g[--pParse->nTem
2b6f0 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pReg];.}../*.** 
2b700 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67  Deallocate a reg
2b710 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76  ister, making av
2b720 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
2b730 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2b740 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a  .** purpose..**.
2b750 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
2b760 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65   is currently be
2b770 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20  ing used by the 
2b780 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68  column cache, th
2b790 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f  en.** the deallo
2b7a0 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72  cation is deferr
2b7b0 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c  ed until the col
2b7c0 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74  umn cache line t
2b7d0 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20  hat uses.** the 
2b7e0 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73  register becomes
2b7f0 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   stale..*/.void 
2b800 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2b810 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2b820 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
2b830 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
2b840 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
2b850 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
2b860 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
2b870 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
2b880 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
2b890 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
2b8a0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
2b8b0 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
2b8c0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
2b8d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
2b8e0 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
2b8f0 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65         p->tempRe
2b900 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  g = 1;.        r
2b910 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
2b920 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
2b930 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
2b940 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
2b950 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2b960 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
2b970 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63  eallocate a bloc
2b980 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63  k of nReg consec
2b990 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e  utive registers.
2b9a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2b9b0 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
2b9c0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
2b9d0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
2b9e0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  ;.  if( nReg==1 
2b9f0 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  ) return sqlite3
2ba00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2ba10 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65  e);.  i = pParse
2ba20 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
2ba30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
2ba40 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
2ba50 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
2ba60 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
2ba70 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
2ba80 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
2ba90 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2baa0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2bab0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2bac0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2bad0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2bae0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2baf0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2bb00 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2bb10 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2bb20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2bb30 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2bb40 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2bb50 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65  nReg){.  if( nRe
2bb60 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==1 ){.    sqli
2bb70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2bb80 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b  g(pParse, iReg);
2bb90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2bba0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2bbb0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
2bbc0 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
2bbd0 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
2bbe0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
2bbf0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2bc00 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
2bc10 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2bc20 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
2bc30 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
2bc40 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2bc50 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
2bc60 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2bc70 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
2bc80 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2bc90 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
2bca0 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
2bcb0 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
2bcc0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2bcd0 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2bce0 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f  Validate that no
2bcf0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2bd00 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e  ter falls within
2bd10 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
2bd20 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20   iFirst..iLast, 
2bd30 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73  inclusive.  This
2bd40 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
2bd50 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69   call from withi
2bd60 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  n assert().** st
2bd70 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66  atements..*/.#if
2bd80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2bd90 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65  .int sqlite3NoTe
2bda0 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65  mpsInRange(Parse
2bdb0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
2bdc0 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29  irst, int iLast)
2bdd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2bde0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2bdf0 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73  eg>0.   && pPars
2be00 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61  e->iRangeReg+pPa
2be10 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3c 69  rse->nRangeReg<i
2be20 4c 61 73 74 0a 20 20 20 26 26 20 70 50 61 72 73  Last.   && pPars
2be30 65 2d 3e 69 52 61 6e 67 65 52 65 67 3e 3d 69 46  e->iRangeReg>=iF
2be40 69 72 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72  irst.  ){.     r
2be50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
2be60 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
2be70 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29  ->nTempReg; i++)
2be80 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
2be90 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69  ->aTempReg[i]>=i
2bea0 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d  First && pParse-
2beb0 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c  >aTempReg[i]<=iL
2bec0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
2bed0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
2bee0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2bef0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2bf00 44 45 42 55 47 20 2a 2f 0a                       DEBUG */.