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

Artifact f12a581f342a6fd85d14c31e4fb84f16b3dd107f54d7728dddb62cebc79d7ce1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
1e20: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
1e30: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
1e40: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
1e50: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1e60: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
1e70: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
1e80: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
1e90: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
1ea0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
1eb0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
1ec0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
1ed0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
1ee0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
1ef0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
1f00: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
1f10: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
1f20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
1f30: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
1f40: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1f50: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
1f60: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
1f70: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
1f80: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
1f90: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
1fa0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
1fb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1fc0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
1fd0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
1fe0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1ff0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
2000: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2010: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2020: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2030: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2040: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2050: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2060: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2070: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2080: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2090: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
20a0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
20b0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
20c0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
20d0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
20e0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
20f0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
2100: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2110: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2120: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2130: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2140: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2150: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2160: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2170: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2180: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2190: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
21a0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
21b0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
21c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21d0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
21e0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
21f0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
2200: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2210: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2220: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2230: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2240: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2250: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2260: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2270: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2280: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2290: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
22a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
22b0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
22c0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
22d0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
22e0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
22f0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
2300: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2310: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2320: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2330: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2340: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2350: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2360: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2370: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2380: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2390: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
23a0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
23b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23c0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
23d0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
23e0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
23f0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
2400: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2410: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2420: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2430: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2440: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2450: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2460: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2470: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2480: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2490: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
24a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
24c0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
24d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
24e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
24f0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2500: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2510: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2520: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2530: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2550: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2560: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2570: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2580: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2590: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
25a0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
25b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
25c0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
25d0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
25e0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
25f0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
2600: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2610: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2620: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2630: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2640: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2650: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2660: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2670: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2680: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2690: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
26a0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
26b0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
26c0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
26d0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
26e0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
26f0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2700: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2710: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2720: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2730: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2740: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2750: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2760: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2770: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2780: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2790: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
27a0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27b0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
27c0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
27d0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
27e0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2800: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2810: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2820: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2830: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2840: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2850: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2870: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2880: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2890: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
28a0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
28b0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
28c0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
28d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
28e0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
28f0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2900: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2910: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2920: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2930: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2940: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2950: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2960: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2970: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2980: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2990: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
29a0: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
29b0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
29c0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
29d0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
29e0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
29f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2a00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a10: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2a20: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2a30: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2a40: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2a60: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2a70: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2a80: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2a90: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2aa0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ab0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2ac0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ad0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ae0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2af0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2b10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2b20: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2b30: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2b40: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2b50: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2b60: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2b70: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2b80: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2b90: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2ba0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2bb0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2bc0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2bd0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2be0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2bf0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c00: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
2c10: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
2c20: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
2c30: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
2c40: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
2c50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
2c60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
2c80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2c90: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 65 78  inter to a subex
2ca0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56 65 63  pression of pVec
2cb0: 74 6f 72 20 74 68 61 74 20 69 73 20 74 68 65 20  tor that is the 
2cc0: 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  i-th.** column o
2cd0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 28 6e 75  f the vector (nu
2ce0: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
2cf0: 77 69 74 68 20 30 29 2e 20 20 54 68 65 20 63 61  with 0).  The ca
2d00: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73  ller must.** ens
2d10: 75 72 65 20 74 68 61 74 20 69 20 69 73 20 77 69  ure that i is wi
2d20: 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a  thin range..**.*
2d30: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
2d40: 72 65 61 6c 6c 79 20 61 20 73 63 61 6c 61 72 20  really a scalar 
2d50: 28 61 6e 64 20 22 73 63 61 6c 61 72 22 20 68 65  (and "scalar" he
2d60: 72 65 20 69 6e 63 6c 75 64 65 73 20 73 75 62 71  re includes subq
2d70: 75 65 72 69 65 73 0a 2a 2a 20 74 68 61 74 20 72  ueries.** that r
2d80: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 63  eturn a single c
2d90: 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20 72 65 74  olumn!) then ret
2da0: 75 72 6e 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f  urn pVector unmo
2db0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56  dified..**.** pV
2dc0: 65 63 74 6f 72 20 72 65 74 61 69 6e 73 20 6f 77  ector retains ow
2dd0: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 72  nership of the r
2de0: 65 74 75 72 6e 65 64 20 73 75 62 65 78 70 72 65  eturned subexpre
2df0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
2e00: 74 68 65 20 76 65 63 74 6f 72 20 69 73 20 61 20  the vector is a 
2e10: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65  (SELECT ...) the
2e20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2e30: 20 72 65 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20   returned is.** 
2e40: 6a 75 73 74 20 74 68 65 20 65 78 70 72 65 73 73  just the express
2e50: 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ion for the i-th
2e60: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
2e70: 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 6d 61 79  ult set, and may
2e80: 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 79  .** not be ready
2e90: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 20   for evaluation 
2ea0: 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c  because the tabl
2eb0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
2ec0: 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73   yet.** been pos
2ed0: 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72  itioned..*/.Expr
2ee0: 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46   *sqlite3VectorF
2ef0: 69 65 6c 64 53 75 62 65 78 70 72 28 45 78 70 72  ieldSubexpr(Expr
2f00: 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74 20 69   *pVector, int i
2f10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73  ){.  assert( i<s
2f20: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
2f30: 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20 29 3b  Size(pVector) );
2f40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2f50: 70 72 49 73 56 65 63 74 6f 72 28 70 56 65 63 74  prIsVector(pVect
2f60: 6f 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  or) ){.    asser
2f70: 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d  t( pVector->op2=
2f80: 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f  =0 || pVector->o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 3b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f  ;.    if( pVecto
2fb0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
2fc0: 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32   || pVector->op2
2fd0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
2ff0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
3000: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3010: 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
3020: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
3030: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
3040: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
3050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65    }.  return pVe
3060: 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ctor;.}.#endif /
3070: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
3080: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
3090: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
30a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
30b0: 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  Y./*.** Compute 
30c0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
30d0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69   Expr object whi
30e0: 63 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74  ch when passed t
30f0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  o.** sqlite3Expr
3100: 43 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65  Code() will gene
3110: 72 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61  rate all necessa
3120: 72 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  ry code to compu
3130: 74 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64  te.** the iField
3140: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
3150: 65 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  e vector express
3160: 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a  ion pVector..**.
3170: 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20  ** It is ok for 
3180: 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20  pVector to be a 
3190: 73 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20  scalar (as long 
31a0: 61 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20  as iField==0).  
31b0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
31c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  , this routine w
31d0: 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  orks like sqlite
31e0: 33 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a  3ExprDup()..**.*
31f0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e  * The caller own
3200: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  s the returned E
3210: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  xpr object and i
3220: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
3230: 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68  r.** ensuring th
3240: 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
3250: 76 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79  value eventually
3260: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a   gets freed..**.
3270: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65  ** The caller re
3280: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
3290: 6f 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20  of pVector.  If 
32a0: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
32b0: 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20  SELECT,.** then 
32c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
32d0: 65 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e  ect will referen
32e0: 63 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73  ce pVector and s
32f0: 6f 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72  o pVector must r
3300: 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66  emain.** valid f
3310: 6f 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74  or the life of t
3320: 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
3330: 63 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20  ct.  If pVector 
3340: 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  is a TK_VECTOR.*
3350: 2a 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78  * or a scalar ex
3360: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69  pression, then i
3370: 74 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  t can be deleted
3380: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73   as soon as this
3390: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
33a0: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69  rns..**.** A tri
33b0: 63 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b  ck to cause a TK
33c0: 5f 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20  _SELECT pVector 
33d0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f  to be deleted to
33e0: 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74  gether with.** t
33f0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
3400: 20 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74   object is to at
3410: 74 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72  tach the pVector
3420: 20 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66   to the pRight f
3430: 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ield.** of the r
3440: 65 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43  eturned TK_SELEC
3450: 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62  T_COLUMN Expr ob
3460: 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ject..*/.Expr *s
3470: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
3480: 74 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73  torField(.  Pars
3490: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
34a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
34b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
34c0: 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a  Vector,       /*
34d0: 20 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69   The vector.  Li
34e0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
34f0: 73 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43  s or a sub-SELEC
3500: 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c  T */.  int iFiel
3510: 64 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  d           /* W
3520: 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  hich column of t
3530: 68 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74  he vector to ret
3540: 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  urn */.){.  Expr
3550: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56   *pRet;.  if( pV
3560: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
3570: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
3580: 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61  rt( pVector->fla
3590: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
35a0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t );.    /* The 
35b0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
35c0: 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20   Expr node:.    
35d0: 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a  **.    ** pLeft:
35e0: 20 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74             pVect
35f0: 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b  or containing TK
3600: 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65  _SELECT.  Not de
3610: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52  leted..    ** pR
3620: 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e  ight:          n
3630: 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65  ot used.  But re
3640: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3650: 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d  d..    ** iColum
3660: 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78  n:         Index
3670: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
3680: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69  pVector.    ** i
3690: 54 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20  Table:          
36a0: 30 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20  0 or the number 
36b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68  of columns on th
36c0: 65 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69  e LHS of an assi
36d0: 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c  gnment.    ** pL
36e0: 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46  eft->iTable:   F
36f0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3700: 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c   of register hol
3710: 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20  ding result, or 
3720: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
3730: 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65            if the
3740: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79   result is not y
3750: 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20  et computed..   
3760: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   **.    ** sqlit
3770: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73  e3ExprDelete() s
3780: 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70  pecifically skip
3790: 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
37a0: 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a  delete of.    **
37b0: 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c   pLeft on TK_SEL
37c0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
37d0: 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73  .  But pRight is
37e0: 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56   followed, so pV
37f0: 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e  ector.    ** can
3800: 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20   be attached to 
3810: 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20  pRight to cause 
3820: 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b  this node to tak
3830: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20  e ownership of. 
3840: 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20     ** pVector.  
3850: 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20  Typically there 
3860: 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65  will be multiple
3870: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3880: 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77  N nodes.    ** w
3890: 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65  ith the same pLe
38a0: 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ft pointer to th
38b0: 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f  e pVector, but o
38c0: 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a  nly one of them.
38d0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20      ** will own 
38e0: 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20  the pVector..   
38f0: 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73   */.    pRet = s
3900: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
3910: 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  se, TK_SELECT_CO
3920: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
3930: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
3940: 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e     pRet->iColumn
3950: 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20   = iField;.     
3960: 20 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70   pRet->pLeft = p
3970: 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Vector;.    }.  
3980: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
3990: 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c  0 || pRet->iTabl
39a0: 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  e==0 );.  }else{
39b0: 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72  .    if( pVector
39c0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ->op==TK_VECTOR 
39d0: 29 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63  ) pVector = pVec
39e0: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
39f0: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
3a00: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
3a10: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
3a20: 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29  >db, pVector, 0)
3a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3a40: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
3a50: 20 21 64 65 66 69 6e 65 28 53 51 4c 49 54 45 5f   !define(SQLITE_
3a60: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a  OMIT_SUBQUERY) *
3a70: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  /../*.** If expr
3a80: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a90: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3aa0: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3ab0: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3ac0: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3ad0: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3ae0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3af0: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3b00: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3b10: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3b20: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3b30: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3b40: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3b50: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3b60: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3b70: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b80: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b90: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3ba0: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3bb0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3bc0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3bd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3be0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3bf0: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3c00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3c10: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3c20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3c30: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3c40: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3c50: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3c60: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3c70: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c90: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3ca0: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3cb0: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3cc0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3cd0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3ce0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3cf0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3d00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3d10: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3d20: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3d30: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3d40: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3d50: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3d60: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3d70: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d80: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d90: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3da0: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3db0: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3dc0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dd0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3de0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3df0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3e00: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3e10: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3e20: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3e30: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3e40: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3e50: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3e60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3e70: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e90: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3ea0: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3eb0: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3ec0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3ed0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3ee0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3ef0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3f00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3f10: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3f20: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3f30: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3f40: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3f50: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3f60: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3f70: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f80: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3fa0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3fb0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3fc0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3fd0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3fe0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3ff0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
4000: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4020: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4030: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4040: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4050: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4060: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4070: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4080: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
40a0: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
40b0: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
40c0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
40f0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4100: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4110: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4120: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4130: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4140: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4150: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4160: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4170: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4180: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4190: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
41b0: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
41c0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
41d0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
41e0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
41f0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4200: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4210: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4220: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4230: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4240: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4250: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4260: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4270: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4280: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4290: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
42a0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
42b0: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
42c0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
42d0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
42e0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
42f0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4300: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4310: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4320: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4330: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4340: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4350: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4360: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4370: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4380: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4390: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
43a0: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
43b0: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
43c0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
43d0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
43e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
43f0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4410: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4420: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4430: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4440: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4450: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4460: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4470: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4480: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4490: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
44a0: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
44c0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
44d0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
44e0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
44f0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4500: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4510: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4520: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4530: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4540: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4550: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4560: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4580: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4590: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
45a0: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
45c0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
45d0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45f0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4600: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4610: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4620: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4630: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4640: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4650: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4660: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4670: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4680: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
46a0: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
46b0: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
46c0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
46d0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
46e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
46f0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4700: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4710: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
4720: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
4730: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4740: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
4750: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
4760: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4770: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4780: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4790: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
47a0: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
47b0: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
47c0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
47d0: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
47e0: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
47f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4800: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4810: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
4820: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
4830: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
4840: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
4850: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
4860: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
4870: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4880: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4890: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
48a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
48b0: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
48c0: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
48d0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
48e0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
48f0: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4900: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4910: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
4920: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
4930: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
4940: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
4950: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
4960: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
4970: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4980: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4990: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
49a0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
49c0: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
49d0: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
49e0: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
49f0: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4a00: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4a10: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
4a20: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
4a30: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
4a40: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
4a50: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
4a60: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
4a70: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a80: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a90: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4aa0: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4ab0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4ac0: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4ad0: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4ae0: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4af0: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4b00: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4b10: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4b20: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4b30: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4b40: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4b50: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4b60: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4b70: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b80: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b90: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4ba0: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4bb0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4bc0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4bd0: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4be0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4bf0: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4c00: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4c10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4c20: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4c30: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4c40: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4c50: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4c60: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4c70: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4ca0: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4cb0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4cc0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4cd0: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4ce0: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4cf0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4d00: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4d10: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4d70: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d90: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4da0: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4db0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4dc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4dd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4de0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4df0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4e00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4e10: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4e20: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4e40: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4e50: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4e60: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e90: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4ea0: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4eb0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4ec0: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4ed0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4ee0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4ef0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4f00: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4f10: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4f20: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4f30: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4f40: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4f50: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4f60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4f70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f80: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f90: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4fa0: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4fb0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4fc0: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4fd0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4fe0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4ff0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
5000: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5010: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5020: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5030: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5050: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
5060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
5070: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5080: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5090: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
50a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
50b0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
50c0: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
50d0: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
50e0: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
50f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5100: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5110: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5120: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5130: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5140: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5150: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5160: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5170: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5190: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
51a0: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
51b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
51c0: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
51d0: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
51e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
51f0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5200: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5210: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5220: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5230: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5240: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5250: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
5260: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
5270: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5280: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5290: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
52a0: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
52b0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
52c0: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
52d0: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
52e0: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
52f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5300: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5310: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5320: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5330: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5340: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5350: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
5360: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
5370: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5380: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5390: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
53a0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
53b0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
53c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
53d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
53f0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5400: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5410: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5420: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5430: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5440: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
5450: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
5460: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
5470: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5480: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5490: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
54a0: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
54b0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
54c0: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
54f0: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5500: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5510: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
5520: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5530: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5540: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
5550: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5560: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5570: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5580: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5590: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
55a0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
55b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
55c0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
55d0: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
55e0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
55f0: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5600: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5610: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
5620: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
5630: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
5640: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
5650: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
5660: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
5670: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5680: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5690: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
56a0: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
56b0: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
56c0: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
56d0: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
56e0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
56f0: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5700: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5710: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
5720: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
5730: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
5740: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
5750: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
5760: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
5770: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5780: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5790: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
57a0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
57b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
57c0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
57d0: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
57e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
57f0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5800: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5810: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
5820: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5830: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
5840: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
5850: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5860: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5870: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5880: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5890: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
58a0: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
58b0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
58c0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
58d0: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
58e0: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
58f0: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5900: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5910: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
5920: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
5930: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
5940: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
5950: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
5960: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
5970: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5980: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5990: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
59a0: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
59b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
59c0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
59d0: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
59e0: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
59f0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5a00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5a10: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
5a20: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5a30: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
5a40: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
5a50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5a60: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5a70: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a80: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a90: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5aa0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5ab0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5ac0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5ad0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5ae0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5af0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5b00: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5b10: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5b20: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5b30: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5b40: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5b50: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5b60: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5b70: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b80: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b90: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5ba0: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5bb0: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5bc0: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5bd0: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5be0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5bf0: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5c00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5c10: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5c20: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5c30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5c40: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5c50: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5c60: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5c70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c80: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c90: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5cb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5cc0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5cd0: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5cf0: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5d00: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5d10: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5d20: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5d30: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5d40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5d50: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5d60: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5d70: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d80: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d90: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5da0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5db0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5dc0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5dd0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5de0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5df0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5e00: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5e10: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5e20: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5e30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5e40: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5e50: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5e60: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5e70: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e80: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e90: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5ea0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5eb0: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5ec0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5ed0: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5ee0: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5ef0: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5f00: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5f10: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5f20: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5f30: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5f40: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5f50: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5f60: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5f70: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f80: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f90: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5fa0: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5fb0: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5fc0: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5fd0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5fe0: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5ff0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
6000: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
6010: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
6020: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
6030: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
6040: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
6050: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
6060: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
6070: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6080: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6090: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
60a0: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
60b0: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
60c0: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
60d0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
60e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6100: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6110: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
6120: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6140: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6150: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
6160: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
6170: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6180: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6190: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
61a0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
61b0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
61c0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
61d0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
61e0: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
61f0: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6200: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6210: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
6220: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
6230: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
6240: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
6250: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
6260: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
6270: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6280: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6290: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
62a0: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
62b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
62c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
62d0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
62e0: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
62f0: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6300: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6310: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
6320: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
6330: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
6340: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
6350: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
6360: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
6370: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6380: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6390: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
63a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
63b0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
63c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
63d0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
63e0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
63f0: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6400: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6410: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6420: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6430: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6440: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6450: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
6460: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
6470: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6480: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
6490: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
64a0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
64b0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
64c0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
64d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
64e0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
64f0: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6500: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6510: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6520: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6530: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6550: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
6560: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
6570: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
6580: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
6590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
65a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
65b0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
65c0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
65d0: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
65e0: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
65f0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6600: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6610: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6620: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6640: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6650: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
6660: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
6670: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6690: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
66a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
66b0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
66c0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
66d0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
66e0: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
66f0: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6700: 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f    x.n = zToken ?
6710: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6720: 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20  (zToken) : 0;.  
6730: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
6740: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20  prAlloc(db, op, 
6750: 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &x, 0);.}../*.**
6760: 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73   Attach subtrees
6770: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6780: 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f  t to the Expr no
6790: 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  de pRoot..**.** 
67a0: 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74  If pRoot==NULL t
67b0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
67c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
67d0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
67e0: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61  urred..** In tha
67f0: 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74  t case, delete t
6800: 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  he subtrees pLef
6810: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f  t and pRight..*/
6820: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6830: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6840: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6850: 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20    Expr *pRoot,. 
6860: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20   Expr *pLeft,.  
6870: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
6880: 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29    if( pRoot==0 )
6890: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
68a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
68b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
68c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
68d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
68e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
68f0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6900: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
6910: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6920: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
6930: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6940: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6950: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
6960: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
6970: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6980: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6990: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
69a0: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
69b0: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
69c0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
69d0: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
69e0: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
69f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6a00: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6a10: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
6a20: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
6a30: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
6a40: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
6a50: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
6a60: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
6a70: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6a80: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6a90: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6aa0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6ab0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6ac0: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6ad0: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6ae0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6af0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6b00: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6b10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6b20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6b30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b50: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6b60: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6b70: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6b80: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6b90: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6ba0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
6bb0: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
6bc0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
6bd0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6be0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6c00: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6c10: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6c20: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6c30: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6c40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6c50: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6c60: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6c80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6c90: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
6ca0: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6cb0: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6cc0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
6cd0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6ce0: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
6cf0: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
6d00: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6d20: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6d30: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
6d40: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
6d50: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
6d60: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
6d70: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
6d80: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
6d90: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
6da0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
6db0: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
6dc0: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
6dd0: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
6de0: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
6df0: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
6e00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
6e10: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
6e20: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
6e30: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
6e40: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
6e50: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6e60: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
6e70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6e80: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
6e90: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
6ea0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
6eb0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6ec0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6ed0: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
6ee0: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
6ef0: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
6f00: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
6f10: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
6f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
6f30: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6f40: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6f50: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
6f60: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
6f70: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
6f80: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f90: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
6fa0: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
6fb0: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
6fc0: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
6fd0: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
6fe0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
6ff0: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
7000: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
7010: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
7020: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
7030: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
7040: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
7050: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
7060: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
7070: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
7080: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
7090: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
70a0: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
70b0: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
70c0: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
70d0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
70e0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
70f0: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
7100: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
7110: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
7120: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
7130: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
7140: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
7150: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7160: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
7170: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
7180: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
7190: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
71a0: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
71b0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
71c0: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
71d0: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
71e0: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
71f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7200: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
7210: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
7220: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7230: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
7240: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
7250: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
7260: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7270: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7280: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
7290: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
72a0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
72b0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
72c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
72d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
72e0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
72f0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7300: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7310: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
7320: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
7330: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
7340: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
7350: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
7360: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
7370: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7380: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7390: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
73a0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
73b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
73c0: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
73d0: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
73e0: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
73f0: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
7400: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
7410: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
7420: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
7430: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
7440: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
7450: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
7460: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7470: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
7480: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
7490: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
74a0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
74b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
74c0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
74d0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
74e0: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
74f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
7500: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
7510: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
7520: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
7530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7540: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
7550: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
7560: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
7570: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7580: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7590: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
75a0: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
75b0: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
75c0: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
75d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
75e0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
75f0: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
7600: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
7610: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
7620: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
7630: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
7640: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
7650: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
7660: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
7670: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
7680: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
7690: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
76a0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
76b0: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
76c0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
76d0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
76e0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
76f0: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7700: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7710: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
7720: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
7730: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7740: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
7750: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
7760: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
7770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7780: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7790: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
77a0: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
77b0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
77c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
77d0: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
77e0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
77f0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7800: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7810: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
7820: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7830: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7840: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
7850: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7860: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
7870: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7880: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7890: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
78a0: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
78b0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
78c0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
78d0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
78e0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
78f0: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7900: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7910: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7920: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7930: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7940: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7950: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7960: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
7970: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7980: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7990: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
79a0: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
79b0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
79c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
79d0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
79e0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
79f0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7a00: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7a10: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7a20: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7a30: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7a40: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7a50: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7a60: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7a70: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7a80: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7a90: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7aa0: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7ab0: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7ac0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7ad0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7ae0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7af0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7b10: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7b20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7b30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7b50: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7b60: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7b70: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7b80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b90: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7ba0: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7bb0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7bc0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7bd0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7be0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7bf0: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7c00: 73 73 65 72 74 28 20 6e 3d 3d 73 71 6c 69 74 65  ssert( n==sqlite
7c10: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
7c20: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
7c30: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
7c40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
7c50: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
7c60: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
7c70: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
7c80: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
7c90: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
7ca0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
7cc0: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
7cd0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7ce0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7cf0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7d00: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7d10: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7d20: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7d30: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7d40: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7d50: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
7d60: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
7d70: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
7d80: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
7d90: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
7da0: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
7db0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7dc0: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
7dd0: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
7de0: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
7df0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7e00: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
7e10: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
7e20: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
7e30: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7e40: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
7e50: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7e60: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7e70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7e80: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7e90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7ea0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7eb0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7ec0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7ed0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7ee0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7ef0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7f00: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7f10: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7f20: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7f30: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7f40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7f50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7f60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7f70: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7f80: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7f90: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7fa0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7fb0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7fc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7fe0: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
7ff0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
8000: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
8010: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
8020: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
8030: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8040: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
8050: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
8060: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
8070: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8080: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8090: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
80a0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
80b0: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
80c0: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
80d0: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
80e0: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
80f0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8100: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8110: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
8120: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
8130: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
8140: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
8150: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
8160: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8170: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8180: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8190: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
81a0: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
81b0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
81c0: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
81d0: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
81e0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
81f0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8200: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
8220: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
8230: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
8240: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
8250: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
8260: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
8270: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8280: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8290: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
82a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
82b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
82d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
82e0: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
82f0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8300: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8310: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
8320: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
8330: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8340: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
8350: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
8360: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8370: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8380: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8390: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
83a0: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
83b0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
83c0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
83d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
83e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
83f0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8400: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8410: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
8420: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
8430: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8440: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
8450: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8460: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8470: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8480: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8490: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
84a0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
84b0: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
84c0: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
84d0: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
84e0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
84f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8500: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8510: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8520: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8530: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8540: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8560: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8570: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8580: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8590: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
85a0: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
85b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
85c0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
85d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
85e0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
85f0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
8600: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8610: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
8620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
8630: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
8640: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
8650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8660: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8670: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  lete(db, p->x.pL
8680: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
8690: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
86a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
86b0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
86c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
86d0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45  Token);.  if( !E
86e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86f0: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
8700: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8710: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
8720: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8730: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
8740: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
8750: 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33 45  if( p ) sqlite3E
8760: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8770: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
8780: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8790: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
87a0: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
87b0: 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a  sion structure .
87c0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
87d0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
87e0: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
87f0: 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c  one of EXPR_FULL
8800: 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45  SIZE,.** EXPR_RE
8810: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
8820: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
8830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
8840: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8850: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
8860: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8870: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8880: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b   return EXPR_TOK
8890: 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66  ENONLYSIZE;.  if
88a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
88b0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
88c0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52   ) return EXPR_R
88d0: 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65  EDUCEDSIZE;.  re
88e0: 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49  turn EXPR_FULLSI
88f0: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ZE;.}../*.** The
8900: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
8910: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
8920: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8930: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
8940: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
8950: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
8960: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
8970: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
8980: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
8990: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
89a0: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
89b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
89c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
89d0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
89e0: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
89f0: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
8a00: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
8a10: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
8a20: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
8a30: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
8a40: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
8a50: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
8a60: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
8a70: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
8ad0: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
8ae0: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
8af0: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
8b00: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
8b10: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
8b20: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
8b30: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
8b40: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8b50: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
8b60: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
8b70: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
8b80: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
8b90: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
8ba0: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
8bb0: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
8bc0: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
8bd0: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
8be0: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
8bf0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
8c00: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
8c10: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
8c20: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
8c30: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
8c40: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
8c50: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
8c60: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
8c70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
8c80: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
8c90: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
8ca0: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
8cb0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
8cc0: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
8cd0: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
8ce0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
8cf0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
8d00: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
8d10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
8d20: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
8d30: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
8d40: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
8d50: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
8d60: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
8d70: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
8d80: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
8d90: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
8da0: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
8db0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
8dc0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
8dd0: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
8de0: 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45  r parts of teh E
8df0: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
8e00: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
8e10: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
8e20: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
8e30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8e40: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
8e50: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
8e60: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
8e70: 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52  .** make an EXPR
8e80: 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20  DUP_REDUCE copy 
8e90: 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70  of a reduced exp
8ea0: 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20  ression.  It is 
8eb0: 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f  only legal.** to
8ec0: 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69   reduce a pristi
8ed0: 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ne expression tr
8ee0: 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ee from the pars
8ef0: 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  er.  The impleme
8f00: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75  ntation.** of du
8f10: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8f20: 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74  e() contain mult
8f30: 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74  iple assert() st
8f40: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74  atements that at
8f50: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f  tempt.** to enfo
8f60: 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61  rce this constra
8f70: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
8f80: 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75  nt dupedExprStru
8f90: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  ctSize(Expr *p, 
8fa0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
8fb0: 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  t nSize;.  asser
8fc0: 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  t( flags==EXPRDU
8fd0: 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67  P_REDUCE || flag
8fe0: 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  s==0 ); /* Only 
8ff0: 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61  one flag value a
9000: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65  llowed */.  asse
9010: 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  rt( EXPR_FULLSIZ
9020: 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73  E<=0xfff );.  as
9030: 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28  sert( (0xfff & (
9040: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9050: 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a  kenOnly))==0 );.
9060: 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c    if( 0==flags |
9070: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  | p->op==TK_SELE
9080: 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  CT_COLUMN ){.   
9090: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55   nSize = EXPR_FU
90a0: 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b  LLSIZE;.  }else{
90b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
90c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
90d0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
90e0: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
90f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9100: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9110: 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20  FromJoin) ); .  
9120: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9130: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9140: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20  _MemToken) );.  
9150: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9160: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9170: 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20  _NoReduce) );.  
9180: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
9190: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
91a0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
91b0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
91c0: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
91d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
91e0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
91f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 );.      nSiz
9200: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
9210: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
9220: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
9230: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
9240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9250: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9260: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
9270: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
9280: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
9290: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
92a0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
92b0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
92c0: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
92d0: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
92e0: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
92f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9300: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
9310: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9320: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9330: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
9340: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
9350: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
9360: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9370: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
9380: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
9390: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
93a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
93b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
93c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
93d0: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
93e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
93f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
9400: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
9410: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
9420: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
9430: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
9440: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9450: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
9460: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
9470: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
9480: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
9490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
94a0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
94b0: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
94c0: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
94d0: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
94e0: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
94f0: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
9500: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
9510: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
9520: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
9530: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
9540: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
9550: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
9560: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
9570: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
9580: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
9590: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
95a0: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
95b0: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
95c0: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
95d0: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
95e0: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
95f0: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
9600: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
9610: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
9620: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
9630: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
9640: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
9650: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9660: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9670: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
9680: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
9690: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
96a0: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
96b0: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
96c0: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
96d0: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
96e0: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
96f0: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
9700: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
9710: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
9720: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9730: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
9740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9750: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
9760: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
9770: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
9780: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
9790: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
97a0: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
97b0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
97c0: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
97d0: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
97e0: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
97f0: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
9800: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
9810: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
9820: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
9830: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
9840: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
9850: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
9860: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
9870: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
9880: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
9890: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
98a0: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
98b0: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
98c0: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
98d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
98e0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
98f0: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
9900: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
9910: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
9920: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
9930: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9940: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
9950: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
9960: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
9970: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
9980: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
9990: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
99a0: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
99b0: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
99c0: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
99d0: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
99e0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
99f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
9a00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
9a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
9a20: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
9a30: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9a40: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
9a50: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
9a60: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9a70: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
9a80: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
9a90: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
9aa0: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
9ab0: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
9ac0: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
9ad0: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
9ae0: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9af0: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
9b00: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
9b10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9b20: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
9b30: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
9b40: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
9b50: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
9b60: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
9b70: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
9b80: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
9b90: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
9ba0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
9bb0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
9bc0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
9bd0: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
9be0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
9bf0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
9c00: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
9c10: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
9c20: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
9c30: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
9c40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9c50: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
9c60: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
9c70: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
9c80: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
9c90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
9ca0: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
9cb0: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
9cc0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
9cd0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
9ce0: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
9cf0: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
9d00: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
9d10: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
9d20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9d30: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
9d40: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
9d50: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
9d60: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
9d70: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
9d80: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
9d90: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
9da0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
9db0: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
9dc0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
9dd0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9de0: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
9df0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
9e00: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
9e10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9e20: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
9e30: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
9e40: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
9e50: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
9e60: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
9e70: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
9e80: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
9e90: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
9ea0: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
9eb0: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
9ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ed0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
9ee0: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
9ef0: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
9f00: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
9f10: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
9f20: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9f30: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
9f40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
9f50: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
9f60: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
9f70: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
9f80: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
9f90: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
9fa0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9fb0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
9fc0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
9fd0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
9fe0: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
9ff0: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
a000: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
a010: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
a020: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
a030: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
a040: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a050: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
a060: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
a070: 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   }..    if( 0==(
a080: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
a090: 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b  flags) & (EP_Tok
a0a0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
a0b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c   ){.      /* Fil
a0c0: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
a0d0: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
a0e0: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
a0f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
a100: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a110: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a120: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a130: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
a140: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a150: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
a160: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a180: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a190: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a1a0: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  up(db, p->x.pLis
a1b0: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a1c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a1d0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
a1e0: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
a1f0: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
a200: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a210: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
a220: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a230: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  ly) ){.      zAl
a240: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
a250: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46  NodeSize(p, dupF
a260: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
a270: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a280: 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e  y(pNew, EP_Token
a290: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a2a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a2b0: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20  Left = p->pLeft 
a2c0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a2d0: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a2e0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
a2f0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a300: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a310: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a320: 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20   = p->pRight ?. 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a350: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50  , p->pRight, EXP
a360: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a370: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a380: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42   }.      if( pzB
a390: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
a3a0: 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c   *pzBuffer = zAl
a3b0: 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  loc;.      }.   
a3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
a3d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a3e0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
a3f0: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a400: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
a410: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
a420: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
a430: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a440: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
a450: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a460: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d  iColumn==0 || p-
a470: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
a480: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a490: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c  p->pRight==0  ||
a4a0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70   p->pRight==p->p
a4b0: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Left );.        
a4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a4d0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
a4e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a4f0: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
a500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a510: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a520: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a530: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30  db, p->pRight, 0
a540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
a560: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
a570: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
a580: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
a590: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
a5a0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
a5b0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
a5c0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
a5d0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
a5e0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
a5f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
a600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
a610: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
a620: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
a630: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
a640: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
a650: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
a660: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
a670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
a680: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
a690: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
a6a0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
a6b0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
a6c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a6d0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
a6e0: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
a6f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a700: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
a710: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
a720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a730: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
a740: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
a750: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
a760: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
a770: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
a780: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
a790: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
a7a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a7b0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
a7c0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
a7d0: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
a7e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a7f0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
a800: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
a810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a820: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
a830: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
a840: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
a850: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
a860: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
a870: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
a880: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
a890: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
a8a0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
a8b0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
a8c0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
a8d0: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
a8e0: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
a8f0: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
a900: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
a910: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
a920: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
a930: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
a940: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
a950: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
a960: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
a970: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
a980: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
a990: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
a9a0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
a9b0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
a9c0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
a9d0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
a9e0: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
a9f0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
aa00: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
aa10: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
aa20: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
aa30: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
aa40: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
aa50: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
aa60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
aa70: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
aa80: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
aa90: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
aaa0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
aab0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
aac0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
aad0: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
aae0: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
aaf0: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
ab00: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
ab10: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
ab20: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
ab30: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
ab40: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
ab50: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
ab60: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
ab70: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
ab80: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
ab90: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
aba0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
abb0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
abc0: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
abd0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
abe0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20  E );.  return p 
abf0: 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  ? exprDup(db, p,
ac00: 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a   flags, 0) : 0;.
ac10: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
ac20: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
ac30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
ac40: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
ac50: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
ac60: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
ac70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ac80: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
ac90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
aca0: 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f   *pPriorSelectCo
acb0: 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  l = 0;.  assert(
acc0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
acd0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
ace0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
acf0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
ad00: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
ad10: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
ad20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ad30: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20  pNew->nExpr = i 
ad40: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  = p->nExpr;.  if
ad50: 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52 44  ( (flags & EXPRD
ad60: 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20  UP_REDUCE)==0 ) 
ad70: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45  for(i=1; i<p->nE
ad80: 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70  xpr; i+=i){}.  p
ad90: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
ada0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
adb0: 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69 7a  RawNN(db,  i*siz
adc0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
add0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
ade0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
adf0: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
ae00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ae10: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
ae20: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
ae30: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
ae40: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
ae50: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
ae60: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
ae70: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
ae80: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
ae90: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
aea0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
aeb0: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
aec0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
aed0: 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20   pOldExpr .     
aee0: 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d  && pOldExpr->op=
aef0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
af00: 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77 45  N.     && (pNewE
af10: 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
af20: 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  pr)!=0 .    ){. 
af30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
af40: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
af50: 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20  0 || i>0 );.    
af60: 20 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e    if( pNewExpr->
af70: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  iColumn==0 ){.  
af80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
af90: 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70  ldExpr->pLeft==p
afa0: 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20  OldExpr->pRight 
afb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  );.        pPrio
afc0: 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65  rSelectCol = pNe
afd0: 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  wExpr->pLeft = p
afe0: 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  NewExpr->pRight;
aff0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
b010: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
b020: 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70  ert( pItem[-1].p
b030: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
b040: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
b050: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
b060: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69  tem[-1].pExpr->i
b070: 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20  Column+1 );.    
b080: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
b090: 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74  orSelectCol==pIt
b0a0: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c  em[-1].pExpr->pL
b0b0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  eft );.        p
b0c0: 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  NewExpr->pLeft =
b0d0: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
b0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b0f0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
b100: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b110: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b120: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
b130: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
b140: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b150: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  pOldItem->zSpan)
b160: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
b170: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
b180: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
b190: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
b1a0: 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  0;.    pItem->bS
b1b0: 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49  panIsTab = pOldI
b1c0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b  tem->bSpanIsTab;
b1d0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20  .    pItem->u = 
b1e0: 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d  pOldItem->u;.  }
b1f0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
b200: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
b210: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
b220: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
b230: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
b240: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
b250: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
b260: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b270: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
b280: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
b290: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
b2a0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
b2b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
b2c0: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
b2d0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
b2e0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
b2f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b300: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
b310: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
b320: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
b330: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
b340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b350: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
b360: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
b370: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
b380: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
b390: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
b3a0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b3b0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61    int nByte;.  a
b3c0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b3d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b3e0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
b3f0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
b400: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
b410: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
b420: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
b430: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b440: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b450: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
b460: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
b470: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
b480: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
b490: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
b4a0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
b4b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
b4c0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
b4d0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
b4e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
b4f0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b500: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
b510: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
b520: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
b530: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
b540: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
b550: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b560: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
b570: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b580: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
b590: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
b5a0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
b5b0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b5c0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
b5d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b5e0: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
b5f0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b600: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
b610: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67      pNewItem->fg
b620: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b   = pOldItem->fg;
b630: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
b640: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
b650: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
b660: 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69  pNewItem->addrFi
b670: 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d  llSub = pOldItem
b680: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20  ->addrFillSub;. 
b690: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67     pNewItem->reg
b6a0: 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65  Return = pOldIte
b6b0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
b6c0: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
b6d0: 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
b6e0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
b6f0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
b700: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b710: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b720: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
b730: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
b740: 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  em->pIBIndex = p
b750: 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  OldItem->pIBInde
b760: 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  x;.    if( pNewI
b770: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
b780: 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  c ){.      pNewI
b790: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
b7a0: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
b7b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
b7c0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
b7d0: 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67  1.pFuncArg, flag
b7e0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  s);.    }.    pT
b7f0: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
b800: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
b810: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
b820: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
b830: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
b840: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
b850: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
b860: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
b870: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
b880: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
b890: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
b8a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b8b0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
b8c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
b8d0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
b8e0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
b8f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
b900: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
b910: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
b920: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
b930: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
b940: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
b950: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
b960: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
b970: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
b980: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
b990: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  i;.  assert( db!
b9a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b9b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b9c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b9d0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b9e0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
b9f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
ba00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
ba10: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
ba20: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
ba30: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
ba40: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
ba50: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
ba60: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
ba70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
ba80: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
ba90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
baa0: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
bab0: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
bac0: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
bad0: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
bae0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
baf0: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
bb00: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
bb10: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
bb20: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
bb30: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
bb40: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
bb50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
bb60: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
bb70: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
bb80: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
bb90: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
bba0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
bbb0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
bbc0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
bbd0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
bbe0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
bbf0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bc00: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
bc10: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
bc20: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
bc30: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
bc40: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
bc50: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
bc60: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
bc70: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70  db, Select *pDup
bc80: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bc90: 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30  Select *pRet = 0
bca0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78  ;.  Select *pNex
bcb0: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
bcc0: 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20  **pp = &pRet;.  
bcd0: 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73  Select *p;..  as
bce0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
bcf0: 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20   for(p=pDup; p; 
bd00: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
bd10: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d    Select *pNew =
bd20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
bd30: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
bd40: 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20  (*p) );.    if( 
bd50: 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pNew==0 ) break;
bd60: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
bd70: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
bd80: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
bd90: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
bda0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
bdb0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
bdc0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
bdd0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
bde0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
bdf0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
be00: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
be10: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
be20: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
be30: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
be40: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
be50: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
be60: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
be70: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
be80: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  g, flags);.    p
be90: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
bea0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
beb0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
bec0: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  By, flags);.    
bed0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
bee0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ;.    pNew->pNex
bef0: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70  t = pNext;.    p
bf00: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  New->pPrior = 0;
bf10: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  .    pNew->pLimi
bf20: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bf30: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
bf40: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bf50: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
bf60: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bf70: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
bf80: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  gs);.    pNew->i
bf90: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
bfa0: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
bfb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46  ;.    pNew->selF
bfc0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bfd0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bfe0: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77  emeral;.    pNew
bff0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
c000: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
c010: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
c020: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
c030: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
c040: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
c050: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
c060: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
c070: 57 69 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  With);.    sqlit
c080: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
c090: 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d  pNew, p->zSelNam
c0a0: 65 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e  e);.    *pp = pN
c0b0: 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e  ew;.    pp = &pN
c0c0: 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ew->pPrior;.    
c0d0: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
c0e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
c0f0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
c100: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
c110: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
c120: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
c130: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
c140: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
c150: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
c160: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
c170: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
c180: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
c190: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
c1a0: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
c1b0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
c1c0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
c1d0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
c1e0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
c1f0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
c200: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
c210: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
c220: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
c230: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
c240: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
c250: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
c260: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
c270: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
c280: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
c290: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
c2a0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
c2b0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
c2c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c2e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c2f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
c300: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
c310: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c320: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c330: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
c340: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
c350: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
c360: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
c370: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
c380: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c390: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c3a0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c3b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c3c0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c3d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c3e0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
c3f0: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
c400: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c410: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c420: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c430: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
c440: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71     pList->a = sq
c450: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c460: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c  NN(db, sizeof(pL
c470: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
c480: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
c490: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
c4a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
c4b0: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
c4c0: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
c4d0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
c4e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
c4f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
c500: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
c510: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
c520: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
c530: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t->a, pList->nEx
c540: 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73  pr*2*sizeof(pLis
c550: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
c560: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
c570: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
c580: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
c590: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = a;.  }.  asse
c5a0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
c5b0: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
c5c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
c5d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
c5e0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
c5f0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
c600: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
c610: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
c620: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
c630: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
c640: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
c650: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
c660: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
c670: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
c680: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
c690: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c6a0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
c6b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
c6c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
c6d0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
c6e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
c6f0: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d  s and pExpr form
c700: 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e   a vector assign
c710: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61  ment which is pa
c720: 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a  rt of the SET.**
c730: 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50   clause of an UP
c740: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  DATE statement. 
c750: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
c760: 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29  *        (a,b,c)
c770: 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c   = (expr1,expr2,
c780: 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20  expr3).** Or:   
c790: 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45   (a,b,c) = (SELE
c7a0: 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e  CT x,y,z FROM ..
c7b0: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ..).**.** For ea
c7c0: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76  ch term of the v
c7d0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
c7e0: 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74  , append new ent
c7f0: 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ries to the.** e
c800: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
c810: 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61  List.  In the ca
c820: 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  se of a subquery
c830: 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70   on the RHS, app
c840: 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54  end.** TK_SELECT
c850: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
c860: 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ons..*/.ExprList
c870: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
c880: 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20  tAppendVector(. 
c890: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c8a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c8b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c8c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c8d0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
c8e0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
c8f0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
c900: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
c910: 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20  olumns,      /* 
c920: 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66  List of names of
c930: 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69   LHS of the assi
c940: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  gnment */.  Expr
c950: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
c960: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70     /* Vector exp
c970: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
c980: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
c990: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
c9a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c9b0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b  se->db;.  int n;
c9c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
c9d0: 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f  iFirst = pList ?
c9e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
c9f0: 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73  0;.  /* pColumns
ca00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c   can only be NUL
ca10: 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20  L due to an OOM 
ca20: 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20  but an OOM will 
ca30: 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78  cause an.  ** ex
ca40: 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  it prior to this
ca50: 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69   routine being i
ca60: 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20  nvoked */.  if( 
ca70: 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d  NEVER(pColumns==
ca80: 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  0) ) goto vector
ca90: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
caa0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
cab0: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
cac0: 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  nd_error;..  /* 
cad0: 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
cae0: 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20  vector, then we 
caf0: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  can immediately 
cb00: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
cb10: 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  t .  ** the size
cb20: 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20   of the RHS and 
cb30: 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20  LHS match.  But 
cb40: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  if the RHS is a 
cb50: 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69  SELECT, .  ** wi
cb60: 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e  ldcards ("*") in
cb70: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
cb80: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75  of the SELECT mu
cb90: 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
cba0: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61  efore.  ** we ca
cbb0: 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68  n do the size ch
cbc0: 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68  eck, so defer th
cbd0: 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74  e size check unt
cbe0: 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
cbf0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
cc00: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  Expr->op!=TK_SEL
cc10: 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d  ECT && pColumns-
cc20: 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33  >nId!=(n=sqlite3
cc30: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
cc40: 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71  Expr)) ){.    sq
cc50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
cc60: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
cc70: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
cc80: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
cc90: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
cca0: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
ccb0: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
ccc0: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
ccd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
cce0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b  olumns->nId; i++
ccf0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75  ){.    Expr *pSu
cd00: 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  bExpr = sqlite3E
cd10: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
cd20: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
cd30: 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   i);.    pList =
cd40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cd50: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
cd60: 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b  List, pSubExpr);
cd70: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
cd80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
cd90: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46  pList->nExpr==iF
cda0: 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20  irst+i+1 );.    
cdb0: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
cdc0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
cdd0: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69   = pColumns->a[i
cde0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
cdf0: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
ce00: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
ce10: 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d   }..  if( pExpr-
ce20: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
ce30: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  {.    if( pList 
ce40: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  && pList->a[iFir
ce50: 73 74 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  st].pExpr ){.   
ce60: 20 20 20 45 78 70 72 20 2a 70 46 69 72 73 74 20     Expr *pFirst 
ce70: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  = pList->a[iFirs
ce80: 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t].pExpr;.      
ce90: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e  assert( pFirst->
cea0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
ceb0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20  LUMN );.     .  
cec0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
ced0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cee0: 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69  t in pRight so i
cef0: 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  t will be delete
cf00: 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
cf10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cf20: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
cf30: 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 72 73  d */.      pFirs
cf40: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70  t->pRight = pExp
cf50: 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  r;.      pExpr =
cf60: 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65   0;..      /* Re
cf70: 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20  member the size 
cf80: 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54  of the LHS in iT
cf90: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20  able so that we 
cfa0: 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20  can check that. 
cfb0: 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20       ** the RHS 
cfc0: 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61  and LHS sizes ma
cfd0: 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20  tch during code 
cfe0: 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  generation. */. 
cff0: 20 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61       pFirst->iTa
d000: 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ble = pColumns->
d010: 6e 49 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nId;.    }.  }..
d020: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d030: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ror:.  sqlite3Ex
d040: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
d050: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  pr);.  sqlite3Id
d060: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
d070: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75  Columns);.  retu
d080: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
d090: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20  ** Set the sort 
d0a0: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61  order for the la
d0b0: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68  st element on th
d0c0: 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74  e given ExprList
d0d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d0e0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74  3ExprListSetSort
d0f0: 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a  Order(ExprList *
d100: 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65  p, int iSortOrde
d110: 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  r){.  if( p==0 )
d120: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
d130: 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  t( SQLITE_SO_UND
d140: 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49  EFINED<0 && SQLI
d150: 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20  TE_SO_ASC>=0 && 
d160: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30  SQLITE_SO_DESC>0
d170: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d180: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66  >nExpr>0 );.  if
d190: 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29  ( iSortOrder<0 )
d1a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
d1b0: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d1c0: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
d1d0: 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72  _SO_ASC );.    r
d1e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e  eturn;.  }.  p->
d1f0: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d200: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53  rtOrder = (u8)iS
d210: 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ortOrder;.}../*.
d220: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
d230: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c  ist.a[].zName el
d240: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
d250: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
d260: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
d270: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
d280: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
d290: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
d2a0: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
d2b0: 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68  r.  But pName sh
d2c0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d2d0: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d2e0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d2f0: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d310: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d320: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d330: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
d340: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
d350: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d360: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d370: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d380: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d390: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d3a0: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d3b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
d3c0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
d3d0: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
d3e0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d400: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68  True to cause th
d410: 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71  e name to be deq
d420: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  uoted */.){.  as
d430: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
d440: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
d450: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d460: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d470: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d480: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d4a0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d4b0: 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73     pItem = &pLis
d4c0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
d4d0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
d4e0: 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
d4f0: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
d500: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
d510: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
d520: 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  >db, pName->z, p
d530: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
d540: 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69  ( dequote ) sqli
d550: 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d  te3Dequote(pItem
d560: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ->zName);.  }.}.
d570: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
d580: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
d590: 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  n element of the
d5a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
d5b0: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
d5c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
d5d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
d5e0: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
d5f0: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
d600: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61  error.  But pSpa
d610: 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  n should never b
d620: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
d630: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
d640: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
d650: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
d660: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
d670: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
d680: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
d690: 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  tSpan(.  Parse *
d6a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d6b0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d6c0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d6d0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
d6e0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
d6f0: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
d700: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e  n. */.  ExprSpan
d710: 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20   *pSpan         
d720: 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62  /* The span to b
d730: 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20  e added */.){.  
d740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d750: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
d760: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
d770: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d780: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
d790: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
d7a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
d7b0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
d7c0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
d7d0: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
d7e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
d7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
d800: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
d810: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70   pItem->pExpr==p
d820: 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Span->pExpr );. 
d830: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d840: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
d850: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
d860: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
d870: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
d880: 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74  r*)pSpan->zStart
d890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
d8c0: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
d8d0: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d  >zStart));.  }.}
d8e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
d8f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
d900: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
d910: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
d920: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
d930: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
d940: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
d950: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
d960: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
d970: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
d980: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
d990: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
d9a0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
d9b0: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
d9c0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
d9d0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
d9e0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
d9f0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
da00: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
da10: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
da20: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
da30: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
da40: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
da50: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
da60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
da70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
da80: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
da90: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
daa0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
dab0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
dac0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dad0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
dae0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
daf0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
db00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
db10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
db20: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
db30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
db40: 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
db50: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
db60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
db70: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
db80: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
db90: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
dba0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
dbb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
dbc0: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
dbd0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
dbe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
dbf0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
dc00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
dc10: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
dc20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
dc30: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
dc40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
dc50: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
dc60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dc70: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
dc80: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
dc90: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
dca0: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
dcb0: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
dcc0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
dcd0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
dce0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
dcf0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
dd00: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
dd10: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
dd20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
dd30: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
dd40: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
dd50: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
dd60: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
dd70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dd80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
dd90: 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20  +){.       Expr 
dda0: 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
ddb0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ddc0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ddd0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20  !=0 );.       m 
dde0: 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b  |= pExpr->flags;
ddf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
de00: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
de10: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
de20: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
de30: 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63  cks used to chec
de40: 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  k expressions to
de50: 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20  .** see if they 
de60: 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66  are "constant" f
de70: 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69  or some definiti
de80: 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20  on of constant. 
de90: 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65   The.** Walker.e
dea0: 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72  Code value deter
deb0: 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
dec0: 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20  f "constant" we 
ded0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66  are looking.** f
dee0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  or..**.** These 
def0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
df00: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
df10: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
df20: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
df30: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
df40: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
df50: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
df60: 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20  r->eCode==1.**  
df70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
df80: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
df90: 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c  )           pWal
dfa0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a  ker->eCode==2.**
dfb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
dfc0: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
dfd0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57  )             pW
dfe0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a  alker->eCode==3.
dff0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
e000: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
e010: 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20  nction()        
e020: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e030: 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20  4 or 5.**.** In 
e040: 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63  all cases, the c
e050: 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c  allbacks set Wal
e060: 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20  ker.eCode=0 and 
e070: 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70  abort if the exp
e080: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f  ression.** is fo
e090: 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20  und to not be a 
e0a0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
e0b0: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  The sqlite3ExprI
e0c0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
e0d0: 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f  ion() is used fo
e0e0: 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70  r evaluating exp
e0f0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61  ressions.** in a
e100: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e110: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61  atement.  The Wa
e120: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
e130: 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69   is 5 when parsi
e140: 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  ng.** an existin
e150: 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77  g schema and 4 w
e160: 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  hen processing a
e170: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20   new statement. 
e180: 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61   A bound.** para
e190: 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20  meter raises an 
e1a0: 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74  error for new st
e1b0: 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73  atements, but is
e1c0: 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   silently conver
e1d0: 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66  ted.** to NULL f
e1e0: 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  or existing sche
e1f0: 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  mas.  This allow
e200: 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  s sqlite_master 
e210: 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20  tables that .** 
e220: 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20  contain a bound 
e230: 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73  parameter becaus
e240: 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65  e they were gene
e250: 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76  rated by older v
e260: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
e270: 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65  Lite to be parse
e280: 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
e290: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69  ons of SQLite wi
e2a0: 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a  thout raising a.
e2b0: 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68  ** malformed sch
e2c0: 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  ema error..*/.st
e2d0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
e2e0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
e2f0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
e300: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
e310: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   If pWalker->eCo
e320: 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79  de is 2 then any
e330: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70   term of the exp
e340: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d  ression that com
e350: 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  es from.  ** the
e360: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
e370: 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a  uses of a left j
e380: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
e390: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
e3a0: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
e3b0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
e3c0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
e3d0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20  alker->eCode==2 
e3e0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
e3f0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
e400: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
e410: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e420: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
e430: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
e440: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
e450: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
e460: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
e470: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
e480: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
e490: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
e4a0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
e4b0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  er pWalker->eCod
e4c0: 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65  e==4 or 5 or the
e4d0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68   function has th
e4e0: 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  e.    ** SQLITE_
e4f0: 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e  FUNC_CONST flag.
e500: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
e510: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
e520: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
e530: 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73  de>=4 || ExprHas
e540: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
e550: 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a  P_ConstFunc) ){.
e560: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
e570: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
e580: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e590: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e5a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
e5b0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
e5d0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
e5e0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
e5f0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
e600: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
e610: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
e620: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e630: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
e640: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e650: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e660: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
e670: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e680: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
e690: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
e6a0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e6b0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
e6c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
e6d0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20  alker->eCode==3 
e6e0: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
e6f0: 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75  ==pWalker->u.iCu
e700: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
e710: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
e720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e730: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e740: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
e750: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
e760: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
e770: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
e780: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  E:.      if( pWa
e790: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29  lker->eCode==5 )
e7a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c  {.        /* Sil
e7b0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f  ently convert bo
e7c0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74  und parameters t
e7d0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64  hat appear insid
e7e0: 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20  e of CREATE.    
e7f0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e800: 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68  s into a NULL wh
e810: 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43  en parsing the C
e820: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
e830: 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20  text out.       
e840: 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74   ** of the sqlit
e850: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e_master table *
e860: 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
e870: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
e880: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
e890: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
e8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
e8b0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
e8c0: 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61   in a CREATE sta
e8d0: 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67  tement that orig
e8e0: 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20  inates from.    
e8f0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70      ** sqlite3_p
e900: 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20  repare() causes 
e910: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
e920: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e930: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
e940: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e950: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e960: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
e970: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  */.    default:.
e980: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e990: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
e9a0: 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63  LECT ); /* selec
e9b0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
e9c0: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
e9d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e9e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
e9f0: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65  XISTS ); /* sele
ea00: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
ea10: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
ea20: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
ea30: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
ea40: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
ea50: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
ea60: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
ea70: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
ea80: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
ea90: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
eaa0: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
eab0: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
eac0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73  n WRC_Abort;.}.s
ead0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73  tatic int exprIs
eae0: 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69  Const(Expr *p, i
eaf0: 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74  nt initFlag, int
eb00: 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72   iCur){.  Walker
eb10: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
eb20: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
eb30: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
eb40: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
eb50: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
eb60: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
eb70: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
eb80: 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  k = selectNodeIs
eb90: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e  Constant;.  w.u.
eba0: 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73  iCur = iCur;.  s
ebb0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
ebc0: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
ebd0: 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
ebe0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
ebf0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
ec00: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
ec10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ec20: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
ec30: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
ec40: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
ec50: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a  unction calls..*
ec60: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
ec70: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
ec80: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
ec90: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
eca0: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
ecb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
ecc0: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
ecd0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
ece0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
ecf0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
ed00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ed10: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  prIsConstant(Exp
ed20: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
ed30: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31  exprIsConst(p, 1
ed40: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
ed50: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
ed60: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
ed70: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
ed80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
ed90: 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64  nstant.** that d
eda0: 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65  oes no originate
edb0: 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
edc0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
edd0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75   a join..** Retu
ede0: 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  rn 0 if it invol
edf0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
ee00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
ee10: 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a  or terms from.**
ee20: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
ee30: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  clause..*/.int s
ee40: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ee50: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
ee60: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
ee70: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c  xprIsConst(p, 2,
ee80: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
ee90: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
eea0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
eeb0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
eec0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
eed0: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
eee0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
eef0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
ef00: 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
ef10: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
ef20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
ef30: 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
ef40: 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
ef50: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
ef60: 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
ef70: 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
ef80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ef90: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
efa0: 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
efb0: 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
efc0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
efd0: 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iCur);.}../*.*
efe0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
eff0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
f000: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
f010: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f020: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
f030: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
f040: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
f050: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
f060: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
f070: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
f080: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
f090: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
f0a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
f0b0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
f0c0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
f0d0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
f0e0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
f0f0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
f100: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
f110: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
f120: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
f130: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f140: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
f150: 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74  pr *p, u8 isInit
f160: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49  ){.  assert( isI
f170: 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74  nit==0 || isInit
f180: 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
f190: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34  exprIsConst(p, 4
f1a0: 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a  +isInit, 0);.}..
f1b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f1c0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
f1d0: 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  S./*.** Walk an 
f1e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
f1f0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
f200: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
f210: 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75  tains a.** subqu
f220: 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ery of some kind
f230: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
f240: 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71  here are no subq
f250: 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ueries..*/.int s
f260: 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69  qlite3ExprContai
f270: 6e 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20  nsSubquery(Expr 
f280: 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
f290: 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
f2a0: 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
f2b0: 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
f2c0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
f2d0: 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
f2e0: 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
f2f0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
f300: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
f310: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f320: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f330: 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
f340: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f350: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
f360: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
f370: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
f380: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
f390: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
f3a0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
f3b0: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
f3c0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
f3d0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
f3e0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
f3f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f400: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
f410: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
f420: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
f430: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
f440: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
f450: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
f460: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
f470: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f480: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
f490: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
f4a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
f4b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
f4c0: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
f4d0: 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
f4e0: 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
f4f0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
f500: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
f510: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
f520: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
f530: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
f540: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
f550: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
f560: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
f570: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
f580: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
f590: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
f5a0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
f5b0: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
f5c0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
f5d0: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
f5e0: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
f5f0: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
f600: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
f610: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
f620: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
f630: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f640: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
f650: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
f660: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
f670: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f680: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
f690: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
f6a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f6b0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
f6c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
f6d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f6e0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f6f0: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
f700: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
f710: 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
f720: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
f730: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
f740: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
f750: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f760: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f770: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
f780: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f790: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
f7a0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
f7b0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
f7c0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
f7d0: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
f7e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f7f0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
f800: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f810: 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
f820: 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
f830: 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
f840: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f850: 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
f860: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
f870: 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
f880: 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
f890: 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
f8a0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
f8b0: 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
f8c0: 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
f8d0: 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
f8e0: 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
f8f0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
f900: 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
f910: 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
f920: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f930: 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
f940: 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
f950: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
f960: 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
f970: 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
f980: 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
f990: 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
f9a0: 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
f9b0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
f9c0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
f9d0: 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
f9e0: 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
f9f0: 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
fa00: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
fa10: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
fa20: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
fa30: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
fa40: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
fa50: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
fa60: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
fa70: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
fa80: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
fa90: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
faa0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
fab0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
fac0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
fad0: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
fae0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
faf0: 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
fb00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
fb10: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
fb20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
fb30: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
fb40: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
fb50: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
fb60: 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
fb70: 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f           (p->iCo
fb80: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54  lumn>=0 && p->pT
fb90: 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c  ab->aCol[p->iCol
fba0: 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29  umn].notNull==0)
fbb0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
fbc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
fbd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
fbe0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
fbf0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
fc00: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
fc10: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
fc20: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
fc30: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
fc40: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
fc50: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
fc60: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
fc70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fc80: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
fc90: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
fca0: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
fcb0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
fcc0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
fcd0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
fce0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
fcf0: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
fd00: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
fd10: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
fd20: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
fd30: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
fd40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fd50: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
fd60: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
fd70: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
fd80: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
fd90: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
fda0: 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e  FF_BLOB ) return
fdb0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
fdc0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
fdd0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
fde0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
fdf0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
fe00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
fe10: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
fe20: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
fe30: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
fe40: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
fe50: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
fe60: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
fe70: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
fe80: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
fe90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fea0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
feb0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
fec0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
fed0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
fee0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
fef0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
ff00: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
ff10: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
ff20: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
ff30: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
ff40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
ff50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ff60: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
ff70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
ff80: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
ff90: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
ffa0: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
ffb0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
ffc0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
ffd0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
ffe0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
fff0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
10000 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
10010 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
10020 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
10030 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10040 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
10050 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
10060 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
10070 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
10080 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
10090 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
100a0 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
100b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
100c0 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
100d0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
100e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
100f0 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
10100 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10110 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
10120 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
10130 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
10140 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
10150 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
10160 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
10170 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
10180 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10190 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
101a0 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
101b0 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
101c0 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
101d0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
101e0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
101f0 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
10200 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
10210 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
10220 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
10230 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
10240 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
10250 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
10260 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
10270 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
10280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10290 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
102a0 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
102b0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
102c0 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
102d0 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
102e0 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
102f0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
10300 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
10310 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
10320 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
10330 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
10340 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
10350 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
10360 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10370 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
10380 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
10390 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
103a0 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
103b0 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
103c0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
103d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
103e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
103f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
10400 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
10410 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
10420 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
10430 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
10440 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
10450 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
10460 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
10470 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
10480 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
10490 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
104a0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
104b0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
104c0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
104d0 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
104e0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
104f0 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
10500 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
10510 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
10520 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
10530 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
10540 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
10550 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
10560 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
10570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10580 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
10590 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
105a0 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
105b0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
105c0 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
105d0 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
105e0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
105f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
10610 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
10620 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
10630 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
10640 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
10650 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
10660 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10670 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
10680 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
10690 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
106a0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
106b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
106c0 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
106d0 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
106e0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
106f0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
10700 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
10720 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
10730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
10740 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
10750 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
10760 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10770 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10780 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
10790 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
107a0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
107b0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
107c0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
107d0 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
107e0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
107f0 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
10800 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10810 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
10820 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10830 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
10840 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
10850 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
10860 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
10880 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
10890 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
108a0 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
108b0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
108c0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
108d0 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
108e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
108f0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
10900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10910 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
10920 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
10930 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
10940 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
10950 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
10960 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
10970 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
10980 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
10990 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
109a0 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
109b0 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
109c0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
109d0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
109e0 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
109f0 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
10a00 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
10a10 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
10a20 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10a30 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10a40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10a50 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
10a60 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
10a70 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
10a80 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
10a90 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
10aa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10ab0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
10ac0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
10ad0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10ae0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
10af0 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
10b00 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
10b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10b20 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
10b30 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
10b40 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
10b50 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10b60 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
10b70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10b80 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
10b90 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
10ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10bb0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10bc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
10bd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10be0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
10bf0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
10c00 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
10c10 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
10c20 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
10c30 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
10c40 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
10c50 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
10c60 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
10c70 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
10c80 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
10c90 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
10ca0 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
10cb0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
10cc0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
10cd0 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
10ce0 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
10cf0 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
10d00 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
10d10 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
10d20 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
10d30 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
10d40 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
10d50 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
10d60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10d70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
10d80 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
10d90 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
10da0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
10db0 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
10dc0 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
10dd0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
10de0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
10df0 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
10e00 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
10e10 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10e20 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
10e30 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
10e40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10e50 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
10e60 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
10e70 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
10e80 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
10e90 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
10ea0 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
10eb0 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
10ec0 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
10ed0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
10ee0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
10ef0 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
10f00 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
10f10 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
10f20 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10f30 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
10f40 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
10f50 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
10f60 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
10f70 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
10f80 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
10f90 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
10fa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10fb0 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
10fc0 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
10fd0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
10fe0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
10ff0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
11000 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
11010 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
11020 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
11030 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
11040 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
11050 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
11060 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
11070 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
11080 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
11090 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
110a0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
110b0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
110c0 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
110d0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
110e0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
110f0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
11120 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
11130 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
11140 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
11150 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
11160 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
11170 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
111a0 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
111b0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
111c0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
111d0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
111e0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
111f0 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
11200 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
11210 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
11220 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
11230 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
11240 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
11250 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
11260 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
11270 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
11280 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
11290 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
112a0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
112b0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
112c0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
112d0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
112e0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
112f0 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
11300 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
11310 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
11320 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
11330 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
11340 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
11350 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
11360 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61  must contain exa
11370 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
11380 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
11390 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
113a0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49  N_INDEX_LOOP.  I
113b0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
113c0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
113d0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
113e0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
113f0 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
11400 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d   for a.** fast m
11410 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
11420 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
11430 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
11440 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e  et, the.** IN in
11450 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64  dex will be used
11460 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
11470 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
11480 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  RHS of the.** IN
11490 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
114a0 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c   When IN_INDEX_L
114b0 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  OOP is used (and
114c0 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
114d0 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
114e0 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
114f0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20  he set members) 
11500 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
11510 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  must not contain
11520 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20   duplicates..** 
11530 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  An epheremal tab
11540 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
11550 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
11560 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
11570 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
11580 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
11590 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
115a0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
115b0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
115c0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
115d0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
115e0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
115f0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
11600 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
11610 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
11620 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
11630 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
11640 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
11650 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
11660 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
11670 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
11680 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
11690 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
116a0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
116b0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
116c0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
116d0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
116e0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
116f0 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
11700 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
11710 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
11720 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
11730 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
11740 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
11750 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
11760 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
11770 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
11780 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
11790 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
117a0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
117b0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
117c0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
117d0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
117e0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
117f0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
11800 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
11810 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
11820 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
11830 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
11840 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
11850 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
11860 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
11870 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
11880 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
11890 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
118a0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
118b0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
118c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
118d0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
118e0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
118f0 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
11900 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
11910 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
11920 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
11930 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
11940 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
11950 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
11960 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
11970 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
11980 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
11990 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
119a0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
119b0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
119c0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
119d0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
119e0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
119f0 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
11a00 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
11a10 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
11a20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
11a30 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
11a40 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
11a50 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
11a60 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
11a70 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
11a80 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
11a90 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
11aa0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
11ab0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
11ac0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
11ad0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
11ae0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
11af0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
11b00 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
11b10 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
11b20 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
11b30 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
11b40 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
11b50 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
11b60 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
11b70 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
11b80 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
11b90 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
11ba0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
11bb0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
11bc0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
11bd0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
11be0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
11bf0 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
11c00 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
11c10 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
11c20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
11c30 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
11c40 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
11c50 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
11c60 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
11c70 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
11c80 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
11c90 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
11ca0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
11cb0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
11cc0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
11cd0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
11ce0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
11cf0 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
11d00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
11d10 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
11d20 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
11d30 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
11d40 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
11d50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11d60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
11d80 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
11d90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11da0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11db0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11dc0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
11dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11de0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
11df0 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
11e00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
11e10 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
11e20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
11e30 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
11e40 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
11e50 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
11e60 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
11e70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11e80 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
11e90 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
11ea0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
11eb0 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
11ec0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
11ed0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
11ee0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
11ef0 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
11f30 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
11f40 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
11f50 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f70 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
11f80 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
11f90 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
11fa0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
11fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11fc0 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
11fd0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
11fe0 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
12010 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
12020 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
12030 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12040 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
12050 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
12060 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
12070 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
12080 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
12090 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
120a0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
120b0 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )!=0;..  /* If t
120c0 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49  he RHS of this I
120d0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
120e0 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64  is a SELECT, and
120f0 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a   if it matters .
12100 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
12110 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72  not the SELECT r
12120 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e  esult contains N
12130 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63  ULL values, chec
12140 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  k whether.  ** o
12150 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63  r not NULL is ac
12160 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
12170 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20  (it may not be, 
12180 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65  for example, due
12190 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55   .  ** to NOT NU
121a0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
121b0 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49  n the schema). I
121c0 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  f no NULL values
121d0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20   are possible,. 
121e0 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73   ** set prRhsHas
121f0 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65  Null to 0 before
12200 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f   continuing.  */
12210 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  .  if( prRhsHasN
12220 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67  ull && (pX->flag
12230 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
12240 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
12250 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
12260 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
12270 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
12280 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12290 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
122a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
122b0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
122c0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
122d0 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
122e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
122f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
12300 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
12310 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
12320 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
12330 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
12340 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
12350 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
12360 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
12370 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
12380 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
12390 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
123a0 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
123b0 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
123c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
123d0 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
123e0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
123f0 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
12400 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12410 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
12420 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12430 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
12440 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
12470 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
12480 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
124b0 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
124c0 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
124d0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
124e0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
124f0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
12500 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
12510 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
12520 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
12530 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
12540 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12550 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
12560 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
12570 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
12580 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
12590 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
125a0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
125b0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
125c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
125d0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
125e0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
125f0 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
12600 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
12610 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
12620 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
12630 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
12640 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
12650 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
12660 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12670 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
12680 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
12690 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
126a0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
126b0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
126c0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
126d0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
126e0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
126f0 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
12700 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
12710 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
12720 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
12730 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
12740 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
12750 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
12760 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
12770 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
12780 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
12790 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
127a0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
127b0 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
127c0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
127d0 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
127e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
127f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
12800 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12810 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
12820 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
12830 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
12840 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
12850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12860 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
12870 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12880 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
128b0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
128c0 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
128d0 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20  ity_ok = 1;.    
128e0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
128f0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
12900 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
12910 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
12920 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20  perform each .  
12930 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
12940 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
12950 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
12960 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
12970 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f  table.      ** o
12980 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12990 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
129a0 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20  f it not, it is 
129b0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a  not possible to.
129c0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79        ** use any
129d0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48   index of the RH
129e0 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  S table.  */.   
129f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
12a00 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f  xpr && affinity_
12a10 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ok; i++){.      
12a20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
12a30 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
12a40 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
12a50 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
12a60 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73  int iCol = pELis
12a70 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  t->a[i].pExpr->i
12a80 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
12a90 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71  char idxaff = sq
12aa0 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
12ab0 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43  Affinity(pTab,iC
12ac0 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c  ol); /* RHS tabl
12ad0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  e */.        cha
12ae0 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74  r cmpaff = sqlit
12af0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
12b00 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b  y(pLhs, idxaff);
12b10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12b20 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
12b30 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
12b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12b50 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
12b60 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
12b70 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
12b80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
12b90 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
12ba0 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
12bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12bc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
12bd0 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
12be0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f      /* sqlite3Co
12bf0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20  mpareAffinity() 
12c00 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58  only returns TEX
12c10 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  T if one side or
12c20 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
12c30 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f   ** other has no
12c40 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68   affinity and th
12c50 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20  e other side is 
12c60 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20  TEXT.  Hence,.  
12c70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
12c80 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d   only way for cm
12c90 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20  paff to be TEXT 
12ca0 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f  is for idxaff to
12cb0 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20   be TEXT.       
12cc0 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20       ** and for 
12cd0 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  the term on the 
12ce0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f  LHS of the IN to
12cf0 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74   have no affinit
12d00 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
12d10 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66    assert( idxaff
12d20 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
12d30 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
12d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12d50 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
12d60 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
12d70 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75  ok = sqlite3IsNu
12d80 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
12d90 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  xaff);.        }
12da0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12db0 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
12dc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
12dd0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
12de0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
12df0 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68  will work for th
12e00 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
12e10 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
12e20 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
12e30 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
12e40 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  0; pIdx=pIdx->pN
12e50 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
12e60 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b  Bitmask colUsed;
12e70 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
12e80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73   of the index us
12e90 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
12ea0 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20  Bitmask mCol;   
12eb0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
12ec0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
12ed0 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
12ee0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12ef0 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  umn<nExpr ) cont
12f00 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12f10 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75  /* Maximum nColu
12f20 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74  mn is BMS-2, not
12f30 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20   BMS-1, so that 
12f40 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20  we can compute. 
12f50 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d           ** BITM
12f60 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f  ASK(nExpr) witho
12f70 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a  ut overflowing *
12f80 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
12f90 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
12fa0 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  umn==BMS-2 );.  
12fb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12fc0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
12fd0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
12fe0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
12ff0 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63  olumn>=BMS-1 ) c
13000 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13010 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
13020 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  que ){.         
13030 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
13040 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20  yCol>nExpr.     
13050 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d          ||(pIdx-
13060 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26  >nColumn>nExpr &
13070 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
13080 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20  (pIdx)).        
13090 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
130a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
130b0 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
130c0 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72   not unique over
130d0 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75   the IN RHS colu
130e0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
130f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
13100 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  .  .          co
13110 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20  lUsed = 0;   /* 
13120 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  Columns of index
13130 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a   used so far */.
13140 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
13150 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
13160 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
13170 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
13180 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
13190 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
131a0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
131b0 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c  Expr *pRhs = pEL
131c0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
131d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c  .            Col
131e0 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
131f0 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
13200 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13210 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20   pLhs, pRhs);.  
13220 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
13230 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
13240 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20  assert( pReq!=0 
13250 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pRhs->iColumn
13260 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
13270 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
13280 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
13290 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  0; j<nExpr; j++)
132a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
132b0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
132c0 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f  mn[j]!=pRhs->iCo
132d0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
132e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
132f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43  ssert( pIdx->azC
13300 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20  oll[j] );.      
13310 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71          if( pReq
13320 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
13330 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d  rICmp(pReq->zNam
13340 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
13350 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
13360 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
13370 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
13380 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
133a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
133b0 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20     if( j==nExpr 
133c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
133d0 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b       mCol = MASK
133e0 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20  BIT(j);.        
133f0 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63      if( mCol & c
13400 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20  olUsed ) break; 
13410 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75  /* Each column u
13420 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  sed only once */
13430 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
13440 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20  Used |= mCol;.  
13450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
13460 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
13470 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
13480 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73    .          ass
13490 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c  ert( i==nExpr ||
134a0 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42   colUsed!=(MASKB
134b0 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a  IT(nExpr)-1) );.
134c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f            if( co
134d0 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28  lUsed==(MASKBIT(
134e0 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20  nExpr)-1) ){.   
134f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
13500 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
13510 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
13520 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  he index pIdx is
13530 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20   usable */.     
13540 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
13550 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13560 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
13570 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13580 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
13590 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
135a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
135b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
135c0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30  OP_Explain, 0, 0
135d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
135e0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
135f0 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44  f(db, "USING IND
13600 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45  EX %s FOR IN-OPE
13610 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61  RATOR",pIdx->zNa
13620 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
13630 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
13640 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
13650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13660 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
13670 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
13680 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
13690 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
136a0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
136b0 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
136c0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
136d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
136e0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
136f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
13700 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
13710 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
13720 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
13730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
13740 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13750 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
13760 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
13770 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
13780 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
13790 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
137a0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
137b0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
137c0 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
137d0 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
137e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
137f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13800 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
13810 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
13820 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
13830 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
13840 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
13850 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
13860 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
13870 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
13880 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
13890 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
138a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
138b0 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
138c0 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
138d0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
138e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
138f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
13900 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13910 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13920 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
13930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
13940 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
13950 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
13960 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
13970 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
13980 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
13990 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
139a0 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
139b0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
139c0 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
139d0 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
139e0 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
139f0 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
13a00 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
13a10 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
13a20 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
13a30 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
13a40 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
13a50 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13a60 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
13a70 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
13a80 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
13a90 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
13aa0 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
13ab0 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
13ac0 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
13ad0 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
13ae0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
13af0 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
13b00 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13b10 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
13b20 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
13b30 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
13b40 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
13b50 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
13b60 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
13b70 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
13b80 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
13b90 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
13ba0 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
13bb0 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
13bc0 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
13bd0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13be0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
13bf0 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
13c00 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
13c10 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
13c20 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
13c30 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
13c40 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
13c50 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
13c60 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
13c70 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
13c80 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
13c90 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
13ca0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
13cb0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
13cc0 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
13cd0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
13ce0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
13cf0 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
13d00 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
13d10 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
13d20 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13d30 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
13d40 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
13d50 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
13d60 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
13d70 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
13d80 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13d90 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
13da0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13db0 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
13dc0 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
13dd0 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
13de0 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13df0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
13e00 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
13e10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
13e20 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
13e30 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
13e40 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
13e50 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13e60 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
13e70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13e80 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
13e90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
13ea0 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
13eb0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13ec0 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
13ed0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
13ee0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
13ef0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
13f00 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
13f10 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
13f20 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
13f30 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
13f40 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
13f50 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
13f60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13f70 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
13f80 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
13f90 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
13fa0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
13fb0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
13fc0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
13fd0 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
13fe0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
13ff0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
14000 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
14010 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
14020 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
14030 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
14040 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
14050 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
14060 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
14070 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
14080 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
14090 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
140a0 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
140b0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
140c0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
140d0 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
140e0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
140f0 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
14100 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
14110 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
14120 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
14130 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
14140 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
14150 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
14160 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
14170 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
14180 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
14190 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
141a0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
141b0 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
141c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
141d0 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
141e0 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
141f0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
14200 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
14210 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
14220 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
14230 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
14240 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
14250 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
14260 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14270 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
14280 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
14290 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
142a0 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
142b0 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
142c0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
142d0 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
142e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
142f0 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
14300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
14310 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
14320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
14330 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
14340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14350 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
14360 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
14370 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
14380 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
14390 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
143a0 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
143b0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
143c0 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
143d0 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
143e0 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
143f0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
14400 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
14410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14420 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
14430 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
14440 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
14450 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
14460 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
14470 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
14480 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14490 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
144a0 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
144b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
144c0 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
144d0 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
144e0 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
144f0 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
14500 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
14510 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
14520 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
14530 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
14540 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
14550 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
14560 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
14570 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
14580 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
14590 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
145a0 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
145b0 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
145c0 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
145d0 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
145e0 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
145f0 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
14600 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
14610 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
14620 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
14630 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
14640 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14650 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
14660 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
14670 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
14680 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
14690 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
146a0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
146b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
146c0 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
146d0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
146e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
146f0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
14700 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
14710 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14720 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
14730 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
14740 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
14750 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
14760 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
14770 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
14780 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
14790 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
147a0 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
147b0 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
147c0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
147d0 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
147e0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
147f0 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
14800 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
14810 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
14820 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
14830 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
14840 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
14850 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
14860 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
14870 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
14880 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
14890 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
148a0 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
148b0 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
148c0 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
148d0 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
148e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
148f0 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
14900 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
14910 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
14920 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
14930 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
14940 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
14950 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
14960 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
14970 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
14980 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
14990 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
149a0 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
149b0 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
149c0 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
149d0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
149e0 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
149f0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
14a00 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
14a10 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
14a20 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
14a30 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
14a40 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
14a50 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
14a60 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
14a70 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
14a80 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
14a90 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
14aa0 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
14ab0 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
14ac0 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
14ad0 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
14ae0 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
14af0 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
14b00 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
14b10 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
14b20 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
14b30 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
14b40 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
14b50 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
14b60 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
14b70 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
14b80 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
14b90 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
14ba0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
14bb0 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
14bc0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
14bd0 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
14be0 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
14bf0 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
14c00 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
14c10 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
14c20 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
14c30 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
14c40 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
14c50 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
14c60 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
14c70 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
14c80 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
14c90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
14ca0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14cb0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14cc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
14cd0 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
14ce0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14cf0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14d00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
14d10 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
14d20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
14d30 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
14d40 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
14d50 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
14d60 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
14d70 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
14d80 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
14d90 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
14da0 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
14db0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
14dc0 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
14dd0 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
14de0 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
14df0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
14e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14e10 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
14e20 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
14e30 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
14e40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e60 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
14e70 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
14e80 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
14e90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14ea0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
14eb0 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
14ec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14ed0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
14ee0 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
14ef0 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
14f00 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
14f10 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
14f20 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
14f30 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
14f40 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
14f50 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
14f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
14f70 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
14f80 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
14f90 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
14fa0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
14fb0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
14fc0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
14fd0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
14fe0 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
14ff0 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
15000 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
15010 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
15020 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
15030 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
15040 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
15050 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
15060 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
15070 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
15080 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
15090 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
150a0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
150b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
150c0 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
150d0 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
150e0 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
150f0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
15100 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
15110 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
15120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15130 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
15140 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
15150 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
15160 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
15170 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
15180 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
15190 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  s SUBQUERY %d",.
151a0 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
151b0 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
151c0 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
151d0 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
151e0 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
151f0 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72  R",.        pPar
15200 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15210 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
15220 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15230 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
15240 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
15250 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
15260 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65  DYNAMIC);.  }.#e
15270 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
15280 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
15290 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
152a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
152d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
152e0 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
152f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
15300 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
15310 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
15320 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
15330 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  /.      KeyInfo 
15340 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
15350 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72      /* Key infor
15360 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
15370 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20  int nVal;       
15380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15390 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c  ize of vector pL
153a0 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20  eft */.      .  
153b0 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
153c0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
153d0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  (pLeft);.      a
153e0 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
153f0 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20  || nVal==1 );.. 
15400 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
15410 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
15420 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
15430 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
15440 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
15450 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
15460 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
15470 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65   way.  An epheme
15480 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ral table is .  
15490 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
154a0 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  th index keys re
154b0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
154c0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
154d0 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
154e0 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
154f0 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
15500 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
15510 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
15520 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
15530 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
15540 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
15550 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
15560 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
15570 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
15580 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
15590 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
155a0 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
155b0 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
155c0 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
155d0 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
155e0 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
155f0 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
15600 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
15610 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
15620 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
15630 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
15640 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
15650 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
15660 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
15670 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
15680 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
15690 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
156a0 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
156b0 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
156c0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
156d0 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
156e0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
156f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15700 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
15710 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20  hemeral, .      
15720 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
15730 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56  e, (isRowid?0:nV
15740 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  al));.      pKey
15750 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f  Info = isRowid ?
15760 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49   0 : sqlite3KeyI
15770 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
15780 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a  >db, nVal, 1);..
15790 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
157a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
157b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
157c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
157d0 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
157e0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
157f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
15800 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
15810 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
15820 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
15830 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
15840 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
15850 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
15860 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
15870 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
15880 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
15890 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d  pSelect = pExpr-
158a0 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
158b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
158c0 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
158d0 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
158e0 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
158f0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d );.        /* 
15900 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52  If the LHS and R
15910 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
15920 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74  rator do not mat
15930 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20  ch, that.       
15940 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68   ** error will h
15950 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20  ave been caught 
15960 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72  long before we r
15970 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e  each this point.
15980 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
15990 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e  ALWAYS(pEList->n
159a0 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20  Expr==nVal) ){. 
159b0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44           SelectD
159c0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
159d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
159e0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
159f0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
15a00 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
15a10 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
15a20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64       dest.zAffSd
15a30 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  st = exprINAffin
15a40 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
15a50 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  r);.          pS
15a60 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
15a70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  0;.          tes
15a80 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
15a90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
15aa0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
15ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
15ac0 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
15ad0 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
15ae0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
15af0 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
15b00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
15b10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
15b20 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
15b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15b40 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
15b50 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
15b60 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
15b70 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15b80 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
15b90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
15ba0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
15bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
15bc0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
15bd0 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
15be0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
15bf0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
15c00 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
15c10 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
15c20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
15c30 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  ect() */.       
15c40 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
15c50 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
15c60 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15c70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
15c80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
15c90 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
15ca0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
15cb0 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
15cc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
15cd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15ce0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
15cf0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
15d00 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
15d10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b  ;.            pK
15d20 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
15d30 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
15d40 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a  CompareCollSeq(.
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
15d70 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
15d80 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
15d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15da0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
15db0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
15dc0 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
15dd0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
15de0 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
15df0 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
15e00 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
15e10 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
15e20 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
15e30 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
15e40 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
15e50 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
15e60 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
15e70 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
15e80 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
15e90 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
15ea0 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
15eb0 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
15ec0 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
15ed0 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
15ee0 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
15ef0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
15f00 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
15f10 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
15f20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
15f30 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
15f40 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
15f50 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
15f60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
15f70 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
15f80 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
15f90 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15fa0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
15fb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
15fc0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
15fd0 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
15fe0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
15ff0 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
16000 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  y(pLeft);.      
16010 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
16020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
16030 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
16040 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
16050 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
16060 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
16070 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
16080 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
16090 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
160a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   );.          pK
160b0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
160c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
160d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
160e0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
160f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16100 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
16110 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
16120 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
16130 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
16140 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
16160 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
16170 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16180 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
16190 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56  Rowid ) sqlite3V
161a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
161b0 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
161c0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
161d0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
161e0 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
161f0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
16200 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
16210 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
16220 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
16230 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
16240 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16250 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
16260 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
16270 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
16280 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
16290 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
162a0 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
162b0 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
162c0 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
162d0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
162e0 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
162f0 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
16300 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
16310 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
16320 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
16330 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
16340 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
16350 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16360 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61     if( jmpIfDyna
16370 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74  mic>=0 && !sqlit
16380 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
16390 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
163c0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
163d0 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
163e0 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20  Dynamic = -1;.  
163f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16400 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
16410 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16420 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
16430 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
16440 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
16450 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71  f( isRowid && sq
16460 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
16470 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49  er(pE2, &iValToI
16480 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ns) ){.         
16490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
164a0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
164b0 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  tInt, pExpr->iTa
164c0 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49  ble, r2, iValToI
164d0 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ns);.          }
164e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
164f0 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
16500 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16510 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
16520 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
16530 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
16540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16550 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16560 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20  MustBeInt, r3,. 
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16590 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
165a0 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
165b0 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
165c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
165d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
165e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
165f0 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
16600 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
16610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
16620 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
16630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16640 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
16650 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
16660 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
16670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
16680 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
16690 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
166a0 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20  arse, r3, 1);.  
166b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
166c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
166d0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
166e0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
166f0 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20   r2, r3, 1);.   
16700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16730 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16740 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
16750 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16760 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16770 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
16780 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
16790 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
167a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
167b0 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
167c0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
167d0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
167e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
167f0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
16800 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
16810 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
16820 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
16830 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20    /* Case 3:    
16840 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
16850 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20   ...).      **  
16860 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53     or:    EXISTS
16870 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
16880 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20   ...).      **. 
16890 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45       ** For a SE
168a0 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
168b0 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76  ode to put the v
168c0 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
168d0 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a  lumns of.      *
168e0 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  * the first row 
168f0 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
16900 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72   registers and r
16910 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
16920 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
16930 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
16940 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16950 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
16960 45 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e  EXISTS, write an
16970 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
16980 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
16990 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69  ists).      ** i
169a0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
169b0 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72  nd return that r
169c0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a  egister number..
169d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
169e0 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c  * In both cases,
169f0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75   the query is au
16a00 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49  gmented with "LI
16a10 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20  MIT 1".  Any .  
16a20 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
16a30 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63  ng limit is disc
16a40 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f  arded in place o
16a50 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20  f the new LIMIT 
16a60 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  1..      */.    
16a70 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
16aa0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
16ab0 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
16ac0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
16af0 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20  eal with SELECT 
16b00 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
16b10 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16b40 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
16b50 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
16b60 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
16b70 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
16b80 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
16b90 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
16ba0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16bb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
16bc0 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
16bd0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
16be0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
16bf0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16c00 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16c10 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53  ct) );..      pS
16c20 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
16c30 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65  elect;.      nRe
16c40 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  g = pExpr->op==T
16c50 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d  K_SELECT ? pSel-
16c60 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  >pEList->nExpr :
16c70 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
16c80 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
16c90 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65  &dest, 0, pParse
16ca0 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20  ->nMem+1);.     
16cb0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
16cc0 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28   nReg;.      if(
16cd0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
16ce0 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
16cf0 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
16d00 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64  T_Mem;.        d
16d10 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74  est.iSdst = dest
16d20 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
16d30 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e    dest.nSdst = n
16d40 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Reg;.        sql
16d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16d60 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
16d70 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74  st.iSDParm, dest
16d80 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29  .iSDParm+nReg-1)
16d90 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16da0 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
16db0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
16dc0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
16dd0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
16de0 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
16df0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16e00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16e10 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
16e20 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
16e30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16e40 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
16e50 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
16e60 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16e70 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
16e80 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
16e90 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
16ea0 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
16eb0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
16ec0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54  arse->db, TK_INT
16ed0 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
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 26 73 71 6c 69 74 65 33          &sqlite3
16f00 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
16f10 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
16f20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
16f30 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
16f40 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
16f50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
16f60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16f70 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
16f80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16f90 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16fa0 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
16fb0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
16fc0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
16fd0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
16fe0 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
16ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
17000 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
17010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
17020 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
17030 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
17040 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
17050 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
17060 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
17070 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17080 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
17090 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
170a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
170b0 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
170c0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
170d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
170e0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
170f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17100 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
17110 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
17120 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
17130 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
17140 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
17150 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
17160 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
17170 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
17180 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
17190 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
171a0 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
171b0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
171c0 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
171d0 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
171e0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
171f0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
17200 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
17210 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
17220 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
17230 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
17240 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
17250 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
17260 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
17270 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
17280 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
17290 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
172a0 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
172b0 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
172c0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
172d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
172e0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
172f0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
17300 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
17310 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
17320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
17330 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
17340 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
17350 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
17360 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
17370 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
17380 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17390 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
173a0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
173b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
173c0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
173d0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
173e0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
173f0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
17400 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
17410 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
17420 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
17430 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
17440 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
17450 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
17460 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
17470 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
17480 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
17490 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
174a0 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
174b0 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
174c0 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
174d0 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
174e0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
174f0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
17500 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
17510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
17520 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
17530 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
17540 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
17550 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
17560 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
17570 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
17580 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
17590 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
175a0 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
175b0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
175c0 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
175d0 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
175e0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
175f0 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
17600 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
17610 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
17620 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
17630 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
17640 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
17650 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
17660 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
17670 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17680 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
17690 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
176a0 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
176b0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
176c0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
176d0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
176e0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
176f0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
17700 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
17710 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
17720 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
17730 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
17740 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
17750 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
17760 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
17770 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
17780 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
17790 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
177a0 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
177b0 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
177c0 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
177d0 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
177e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
177f0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
17800 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
17810 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
17820 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17830 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
17840 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
17850 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17860 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
17870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
17880 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
17890 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
178a0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
178b0 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
178c0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
178d0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
178e0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
178f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17900 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
17910 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
17920 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
17930 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
17940 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
17950 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
17960 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
17970 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
17980 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
17990 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
179a0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
179b0 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
179c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
179d0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
179e0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
179f0 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
17a00 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
17a10 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
17a20 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
17a30 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
17a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
17a50 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
17a60 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
17a70 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
17a80 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
17a90 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
17aa0 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
17ab0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
17ac0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
17ad0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
17ae0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
17af0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
17b00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17b10 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
17b20 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
17b30 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
17b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
17b50 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
17b60 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
17b70 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
17b80 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
17b90 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
17ba0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
17bb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17bc0 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
17bd0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
17be0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
17bf0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
17c00 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
17c10 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
17c20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
17c30 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
17c40 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
17c50 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
17c60 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
17c70 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
17c80 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
17c90 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
17ca0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
17cb0 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
17cc0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
17cd0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
17ce0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
17cf0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
17d00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
17d10 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
17d20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66  loop */ ..  pLef
17d30 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
17d40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
17d50 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
17d60 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
17d70 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
17d80 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
17d90 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
17da0 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
17db0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
17dc0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
17dd0 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
17de0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17df0 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
17e00 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
17e10 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
17e20 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
17e30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
17e40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17e50 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
17e60 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
17e70 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
17e80 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
17e90 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
17ea0 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
17eb0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
17ec0 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
17ed0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
17ee0 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
17ef0 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72  ith cursor pExpr
17f00 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63  ->iTable .  ** c
17f10 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
17f20 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
17f30 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
17f40 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
17f50 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
17f60 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
17f70 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
17f80 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
17f90 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
17fa0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
17fb0 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
17fc0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
17fd0 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
17fe0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
17ff0 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
18000 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
18010 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
18020 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
18050 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
18060 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
18090 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
180a0 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
180b0 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b  HasNull, aiMap);
180c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
180d0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63  se->nErr || nVec
180e0 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d  tor==1 || eType=
180f0 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20  =IN_INDEX_EPH.  
18100 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49       || eType==I
18110 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
18120 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  C || eType==IN_I
18130 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
18140 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  .  );.#ifdef SQL
18150 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43  ITE_DEBUG.  /* C
18160 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61  onfirm that aiMa
18170 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65  p[] contains nVe
18180 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c  ctor integer val
18190 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
181a0 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31  d.  ** nVector-1
181b0 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
181c0 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
181d0 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b  .    int j, cnt;
181e0 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30  .    for(cnt=j=0
181f0 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b  ; j<nVector; j++
18200 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d  ) if( aiMap[j]==
18210 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61  i ) cnt++;.    a
18220 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b  ssert( cnt==1 );
18230 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
18240 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
18250 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
18260 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
18270 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  ". If the LHS is
18280 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c   a .  ** vector,
18290 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72   then it is stor
182a0 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ed in an array o
182b0 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74  f nVector regist
182c0 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20  ers starting .  
182d0 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20  ** at r1..  **. 
182e0 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
182f0 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68  nIndex() might h
18300 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68  ave reordered th
18310 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
18320 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20  LHS vector.  ** 
18330 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c  so that the fiel
18340 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  ds are in the sa
18350 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65  me order as an e
18360 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20  xisting index.  
18370 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b   The.  ** aiMap[
18380 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
18390 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20   a mapping from 
183a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53  the original LHS
183b0 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a   field order to.
183c0 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f    ** the field o
183d0 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65  rder that matche
183e0 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e  s the RHS index.
183f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
18400 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
18410 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67  rse);.  rLhsOrig
18420 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f   = exprCodeVecto
18430 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
18440 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72   &iDummy);.  for
18450 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20  (i=0; i<nVector 
18460 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20  && aiMap[i]==i; 
18470 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48  i++){} /* Are LH
18480 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72  S fields reorder
18490 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d  ed? */.  if( i==
184a0 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f  nVector ){.    /
184b0 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65  * LHS fields are
184c0 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a   not reordered *
184d0 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68  /.    rLhs = rLh
184e0 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sOrig;.  }else{.
184f0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
18500 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66  eorder the LHS f
18510 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20  ields according 
18520 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20  to aiMap */.    
18530 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65  rLhs = sqlite3Ge
18540 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
18550 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  e, nVector);.   
18560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
18570 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
18580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18590 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
185a0 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b  LhsOrig+i, rLhs+
185b0 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
185c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
185d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
185e0 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
185f0 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
18600 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
18610 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
18620 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
18630 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
18640 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
18650 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
18660 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
18670 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
18680 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68  s step (1) in th
18690 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
186a0 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72   optimized algor
186b0 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ithm..  */.  if(
186c0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
186d0 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
186e0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
186f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
18700 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
18710 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
18720 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18730 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
18740 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
18750 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18760 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
18770 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
18780 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
18790 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
187a0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
187b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
187c0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
187d0 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
187e0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
187f0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
18800 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
18810 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
18820 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
18830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18840 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
18850 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
18860 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
18870 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
18880 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
18890 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
188a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
188b0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
188c0 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
188d0 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
188e0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
188f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
18900 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
18910 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
18920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18930 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
18940 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
18950 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
18960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18970 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
18980 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
18990 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
189a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
189b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
189c0 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
189d0 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189f0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
18a00 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
18a10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18a20 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
18a30 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
18a40 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18a50 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
18a60 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
18a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18a80 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
18a90 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
18aa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18ab0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
18ac0 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
18ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18ae0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
18af0 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
18b00 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
18b30 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
18b40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18b60 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
18b70 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
18b80 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
18b90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
18ba0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18bb0 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
18bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18bd0 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
18be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18bf0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
18c00 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
18c10 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
18c20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
18c40 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
18c50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18c60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18c70 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
18c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
18c90 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18ca0 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
18cb0 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
18cc0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
18cd0 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
18ce0 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
18cf0 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
18d00 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
18d10 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
18d20 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
18d30 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
18d40 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
18d50 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
18d60 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
18d70 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
18d80 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
18d90 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
18da0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
18db0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
18dc0 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
18dd0 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
18de0 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
18df0 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
18e00 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
18e10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18e20 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
18e30 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
18e40 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
18e50 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
18e60 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
18e70 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
18e80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
18e90 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
18ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18eb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18ec0 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
18ed0 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
18ee0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18ef0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18f00 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
18f10 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
18f20 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
18f30 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
18f40 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
18f50 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
18f60 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
18f70 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
18f80 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
18f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
18fa0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
18fb0 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
18fc0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
18fd0 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
18fe0 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
18ff0 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
19000 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
19010 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
19020 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
19030 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
19040 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
19050 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
19060 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
19070 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19080 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78  P_SeekRowid, pEx
19090 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
190a0 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a  IfFalse, rLhs);.
190b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
190c0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75  (v);.    addrTru
190d0 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
190e0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
190f0 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e  oto);  /* Return
19100 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   True */.  }else
19110 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19120 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
19130 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56  finity, rLhs, nV
19140 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20  ector, 0, zAff, 
19150 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  nVector);.    if
19160 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
19170 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
19180 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74     /* Combine St
19190 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20  ep 3 and Step 5 
191a0 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
191b0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  code */.      sq
191c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
191d0 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
191e0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
191f0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20  , destIfFalse,. 
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
19220 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
19230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
19240 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19250 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f  ;.    }.    /* O
19270 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20  rdinary Step 3, 
19280 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
19290 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c  re FALSE and NUL
192a0 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  L are distinct *
192b0 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  /.    addrTruthO
192c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
192d0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
192e0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
192f0 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ble, 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 72 4c                rL
19320 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
19330 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19340 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e   }..  /* Step 4.
19350 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
19360 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
19370 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20  NULL and we did 
19380 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e  not find.  ** an
19390 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65   match on the se
193a0 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e  arch above, then
193b0 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
193c0 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a   be FALSE..  */.
193d0 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
193e0 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20  l && nVector==1 
193f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
19410 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
19420 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
19430 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
19440 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
19450 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65  * Step 5.  If we
19460 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
19470 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ut the differenc
19480 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61  e between NULL a
19490 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74  nd.  ** FALSE, t
194a0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
194b0 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69  false. .  */.  i
194c0 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
194d0 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c  destIfNull ) sql
194e0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
194f0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
19500 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70   /* Step 6: Loop
19510 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66   through rows of
19520 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61   the RHS.  Compa
19530 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74  re each row to t
19540 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20  he LHS..  ** If 
19550 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  any comparison i
19560 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
19570 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
19580 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f    If all.  ** co
19590 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41  mparisons are FA
195a0 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e  LSE then the fin
195b0 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c  al result is FAL
195c0 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  SE..  **.  ** Fo
195d0 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20  r a scalar LHS, 
195e0 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
195f0 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74   to check just t
19600 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a  he first row.  *
19610 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  * of the RHS..  
19620 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65  */.  if( destSte
19630 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  p6 ) sqlite3Vdbe
19640 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19650 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64  destStep6);.  ad
19660 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
19670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19680 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
19690 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
196a0 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
196b0 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
196c0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
196d0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
196e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
196f0 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l(v);.  }else{. 
19700 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f     /* For nVecto
19710 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74  r==1, combine st
19720 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69  eps 6 and 7 by i
19730 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
19740 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53  ning.    ** FALS
19750 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63  E if the first c
19760 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
19770 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73   NULL */.    des
19780 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49  tNotNull = destI
19790 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f  fFalse;.  }.  fo
197a0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
197b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
197c0 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71   *p;.    CollSeq
197d0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
197e0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
197f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19800 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
19810 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
19820 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
19830 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
19840 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
19850 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  rse, p);.    sql
19860 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19870 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
19880 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72  pr->iTable, i, r
19890 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
198a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
198b0 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  Ne, rLhs+i, dest
198c0 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20  NotNull, r3,.   
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
198f0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
19900 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
19920 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19930 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20  rse, r3);.  }.  
19940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19950 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
19960 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
19970 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
19980 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19990 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
199a0 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20  destNotNull);.  
199b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
199c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
199d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
199e0 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56  ddrTop+1);.    V
199f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a00 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20  .    /* Step 7: 
19a10 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
19a20 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
19a30 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
19a40 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
19a50 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71  false. */.    sq
19a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19a70 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
19a80 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d  estIfFalse);.  }
19a90 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72  ..  /* Jumps her
19aa0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  e in order to re
19ab0 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20  turn true. */.  
19ac0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19ad0 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68  ere(v, addrTruth
19ae0 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70  Op);..sqlite3Exp
19af0 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19b00 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c  :.  if( rLhs!=rL
19b10 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33  hsOrig ) sqlite3
19b20 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19b30 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  Parse, rLhs);.  
19b40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19b50 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56  Pop(pParse);.  V
19b60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19b70 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
19b80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19b90 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
19ba0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
19bb0 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
19bc0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19bd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
19be0 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
19bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19c00 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
19c10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
19c20 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
19c30 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
19c40 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
19c50 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
19c60 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
19c70 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
19c80 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19c90 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19ca0 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
19cb0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
19cc0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
19cd0 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
19ce0 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
19cf0 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
19d00 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
19d10 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
19d20 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
19d30 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
19d40 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
19d50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
19d60 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
19d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
19d80 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
19d90 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
19da0 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
19db0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
19dc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
19dd0 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
19de0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
19df0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
19e00 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
19e10 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
19e20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
19e30 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
19e40 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
19e50 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
19e60 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
19e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e80 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
19e90 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
19ea0 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
19eb0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
19ec0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
19ed0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
19ee0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
19ef0 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
19f00 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
19f10 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19f20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19f30 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
19f40 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
19f50 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
19f60 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
19f70 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
19f80 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19f90 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
19fa0 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
19fb0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
19fc0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19fd0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
19fe0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
19ff0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
1a000 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1a010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1a020 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
1a030 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
1a040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1a060 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
1a070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1a080 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
1a090 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1a0a0 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
1a0b0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
1a0c0 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
1a0d0 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
1a0e0 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
1a0f0 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 31  e);.    if( c==1
1a100 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21 6e 65   || (c==2 && !ne
1a110 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c  gFlag) || (negFl
1a120 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
1a130 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
1a140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1a150 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1a160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a170 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a180 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
1a190 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
1a1a0 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
1a1b0 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
1a1c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
1a1d0 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
1a1e0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
1a1f0 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
1a200 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a210 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a220 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
1a230 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
1a240 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
1a250 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
1a260 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1a270 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1a280 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
1a290 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
1a2a0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1a2b0 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
1a2c0 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
1a2d0 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
1a2e0 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
1a2f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a300 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1a310 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
1a320 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1a330 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
1a340 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
1a350 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65  ase column-cache
1a360 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a   entry number i.
1a370 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1a380 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
1a390 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1a3a0 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72  t i){.  if( pPar
1a3b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1a3c0 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  .tempReg ){.    
1a3d0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1a3e0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
1a3f0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
1a400 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
1a410 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1a420 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1a430 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1a440 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
1a450 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
1a460 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69  nColCache--;.  i
1a470 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  f( i<pParse->nCo
1a480 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50  lCache ){.    pP
1a490 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1a4a0 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
1a4b0 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e  lCache[pParse->n
1a4c0 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d  ColCache];.  }.}
1a4d0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
1a4e0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
1a4f0 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
1a500 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
1a510 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
1a520 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
1a530 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
1a540 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
1a550 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a560 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
1a570 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
1a580 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
1a590 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
1a5a0 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
1a5b0 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
1a5c0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1a5d0 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p;..  /* Unless
1a5e0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
1a5f0 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72  curred, register
1a600 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
1a610 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f  ays positive. */
1a620 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
1a630 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1a640 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
1a650 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1a660 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1a670 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
1a680 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
1a690 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
1a6a0 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
1a6b0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
1a6c0 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
1a6d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
1a6e0 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
1a6f0 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
1a700 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
1a710 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
1a720 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
1a730 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
1a740 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
1a750 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
1a760 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1a770 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70  zationDisabled(p
1a780 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1a790 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29  E_ColumnCache) )
1a7a0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
1a7b0 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
1a7c0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
1a7d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
1a7e0 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
1a7f0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
1a800 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
1a810 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
1a820 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1a830 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
1a840 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
1a850 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
1a860 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
1a870 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
1a880 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
1a890 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a8a0 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1a8b0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1a8c0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1a8d0 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
1a8e0 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
1a8f0 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
1a900 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  f..  /* If the c
1a910 61 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20  ache is already 
1a920 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65  full, delete the
1a930 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20   least recently 
1a940 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20  used entry */.  
1a950 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  if( pParse->nCol
1a960 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f  Cache>=SQLITE_N_
1a970 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20  COLCACHE ){.    
1a980 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
1a990 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20  fff;.    idxLru 
1a9a0 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
1a9b0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1a9c0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1a9d0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1a9e0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1a9f0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
1aa00 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72  ){.        idxLr
1aa10 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d  u = i;.        m
1aa20 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
1aa30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aa40 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1aa50 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1aa60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1aa70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1aa80 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1aa90 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a  olCache++];.  }.
1aaa0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
1aab0 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65  w entry to the e
1aac0 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
1aad0 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  */.  p->iLevel =
1aae0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1aaf0 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  evel;.  p->iTabl
1ab00 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69  e = iTab;.  p->i
1ab10 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
1ab20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1ab30 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20  .  p->tempReg = 
1ab40 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  0;.  p->lru = pP
1ab50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1ab60 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  +;.}../*.** Indi
1ab70 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
1ab80 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
1ab90 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
1aba0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
1abb0 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
1abc0 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
1abd0 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
1abe0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
1abf0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ac00 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
1ac10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1ac20 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1ac30 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
1ac40 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1ac50 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1ac60 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1ac70 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
1ac80 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
1ac90 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20   if( p->iReg >= 
1aca0 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20  iReg && p->iReg 
1acb0 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  < iReg+nReg ){. 
1acc0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1acd0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1ace0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1acf0 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1ad00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
1ad10 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
1ad20 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
1ad30 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
1ad40 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
1ad50 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
1ad60 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
1ad70 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
1ad80 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
1ad90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1ada0 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
1adb0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1adc0 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
1add0 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
1ade0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
1adf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ae00 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1ae10 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1ae20 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1ae30 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1ae40 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
1ae50 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1ae60 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1ae70 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
1ae80 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
1ae90 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
1aea0 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
1aeb0 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
1aec0 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
1aed0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1aee0 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
1aef0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1af00 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
1af10 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
1af20 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
1af30 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
1af40 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
1af50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1af60 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1af70 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  se){.  int i = 0
1af80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1af90 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1afa0 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1afb0 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1afc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1afd0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1afe0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1aff0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1b000 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1b010 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1b020 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1b030 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1b040 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61  f.  while( i<pPa
1b050 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1b060 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1b070 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1b080 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
1b090 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
1b0a0 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1b0b0 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1b0c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b0d0 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1b0e0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
1b0f0 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
1b100 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
1b110 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
1b120 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
1b130 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
1b140 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
1b150 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
1b160 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
1b170 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
1b180 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
1b190 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1b1a0 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
1b1b0 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
1b1c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b1d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b1e0 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
1b1f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1b200 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1b210 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1b220 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1b230 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1b240 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1b250 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1b260 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1b270 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
1b280 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1b290 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1b2a0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1b2b0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1b2c0 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1b2d0 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1b2e0 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1b2f0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1b300 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1b310 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1b320 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b330 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1b340 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1b350 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1b360 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1b370 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1b380 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1b390 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1b3a0 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1b3b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1b3c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1b3d0 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1b3e0 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1b3f0 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1b400 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1b410 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1b420 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1b430 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1b440 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1b450 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1b460 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1b470 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1b480 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1b490 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1b4a0 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1b4b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1b4c0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1b4d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1b4e0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1b4f0 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1b500 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1b510 62 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20  b = iTabCur;.   
1b520 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b530 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1b540 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1b550 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1b560 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1b570 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b580 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1b590 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1b5a0 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1b5b0 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b5e0 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1b5f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b600 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1b610 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1b620 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1b630 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1b640 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b650 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b660 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1b670 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1b680 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1b690 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1b6a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1b6b0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1b6c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1b6d0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1b6e0 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1b6f0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1b700 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1b710 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1b720 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1b730 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1b740 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1b750 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1b760 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1b770 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1b780 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1b790 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1b7a0 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
1b7b0 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
1b7c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b7d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1b7e0 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
1b7f0 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1b800 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
1b810 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
1b820 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
1b830 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
1b840 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
1b850 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
1b860 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
1b870 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
1b880 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1b890 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
1b8a0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1b8b0 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
1b8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b8d0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
1b8e0 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
1b8f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
1b900 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
1b910 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
1b920 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
1b930 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1b940 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b950 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
1b960 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
1b970 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
1b980 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
1b990 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
1b9a0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
1b9b0 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  egister. .**.** 
1b9c0 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  An effort is mad
1b9d0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
1b9e0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
1b9f0 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1ba00 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61  his.** is not ga
1ba10 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74  ranteeed for Get
1ba20 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72  Column() - the r
1ba30 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f  esult can be sto
1ba40 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65  red in.** any re
1ba50 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65  gister.  But the
1ba60 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
1ba70 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e  nteed to land in
1ba80 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a   register iReg.*
1ba90 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54  * for GetColumnT
1baa0 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  oReg()..**.** Th
1bab0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1bac0 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1bad0 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1bae0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1baf0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1bb00 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1bb10 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1bb20 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1bb30 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1bb40 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1bb50 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1bb60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1bb70 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1bb80 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1bb90 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1bba0 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1bbb0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1bbc0 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1bbd0 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1bbe0 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1bbf0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1bc00 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1bc10 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1bc20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1bc30 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1bc40 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1bc50 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1bc60 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1bc70 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1bc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1bc90 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1bca0 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1bcb0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1bcc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1bcd0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1bce0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
1bcf0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1bd00 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1bd10 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1bd20 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1bd30 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
1bd40 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1bd50 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1bd60 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1bd70 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1bd80 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1bd90 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1bda0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1bdb0 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
1bdc0 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
1bdd0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
1bde0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1bdf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1be00 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1be10 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1be20 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1be30 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1be40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1be50 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1be60 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
1be70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1be80 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
1be90 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1bea0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1beb0 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71   iReg;.}.void sq
1bec0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1bed0 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50  ColumnToReg(.  P
1bee0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1bef0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1bf00 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1bf10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1bf20 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1bf30 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1bf40 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1bf50 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1bf60 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1bf70 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1bf80 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1bf90 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1bfa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1bfb0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1bfc0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1bfd0 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1bfe0 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1bff0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1c000 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  t r1 = sqlite3Ex
1c010 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1c020 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1c030 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
1c040 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Reg, 0);.  if( r
1c050 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65  1!=iReg ) sqlite
1c060 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1c070 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1c080 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a  opy, r1, iReg);.
1c090 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
1c0a0 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
1c0b0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
1c0c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1c0d0 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
1c0e0 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1c0f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c100 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1c110 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1c120 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1c130 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1c140 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a  ntf("CLEAR\n");.
1c150 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
1c160 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1c170 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
1c180 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1c190 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
1c1a0 6d 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50  mpReg.     && pP
1c1b0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1c1c0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1c1d0 3e 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29  >aTempReg).    )
1c1e0 7b 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  {.       pParse-
1c1f0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1c200 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1c210 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1c220 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d  e[i].iReg;.    }
1c230 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1c240 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a  ColCache = 0;.}.
1c250 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
1c260 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
1c270 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
1c280 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
1c290 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
1c2a0 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
1c2b0 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
1c2c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c2d0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1c2e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c2f0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1c300 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
1c310 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1c320 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
1c330 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
1c340 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c350 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1c360 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1c370 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1c380 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1c390 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1c3a0 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
1c3b0 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
1c3c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c3d0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1c3e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c3f0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1c400 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1c410 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1c420 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1c430 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1c440 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c450 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1c460 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1c470 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
1c480 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1c490 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
1c4a0 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
1c4b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c4c0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1c4d0 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
1c4e0 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
1c4f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
1c500 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
1c510 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
1c520 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
1c530 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
1c540 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
1c550 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
1c560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1c570 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
1c580 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
1c590 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
1c5a0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
1c5b0 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
1c5c0 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1c5d0 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
1c5e0 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
1c5f0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1c600 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
1c610 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1c620 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1c630 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1c640 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1c650 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1c660 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1c670 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
1c680 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
1c690 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
1c6a0 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
1c6b0 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
1c6c0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1c6d0 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
1c6e0 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
1c6f0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
1c700 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c  * Convert a scal
1c710 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ar expression no
1c720 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
1c730 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a  TER referencing.
1c740 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ** register iReg
1c750 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  .  The caller mu
1c760 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  st ensure that i
1c770 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  Reg already cont
1c780 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
1c790 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1c7a0 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
1c7b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1c7c0 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1c7d0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1c7e0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1c7f0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1c800 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1c810 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1c820 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1c830 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1c840 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  ./*.** Evaluate 
1c850 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  an expression (e
1c860 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
1c870 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
1c880 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65  ssion) and store
1c890 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
1c8a0 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65  n continguous te
1c8b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c8c0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  s.  Return the i
1c8d0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ndex of.** the f
1c8e0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73  irst register us
1c8f0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1c900 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
1c910 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1c920 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1c930 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61   a temporary sca
1c940 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77  lar, then also w
1c950 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67  rite.** that reg
1c960 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74  ister number int
1c970 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20  o *piFreeable.  
1c980 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1c990 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a  result register.
1c9a0 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  ** is not a temp
1c9b0 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20  orary or if the 
1c9c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1c9d0 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72  vector set *piFr
1c9e0 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a  eeable.** to 0..
1c9f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1ca00 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72  prCodeVector(Par
1ca10 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1ca20 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65   *p, int *piFree
1ca30 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  able){.  int iRe
1ca40 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73  sult;.  int nRes
1ca50 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1ca60 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a  rVectorSize(p);.
1ca70 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31    if( nResult==1
1ca80 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20   ){.    iResult 
1ca90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1caa0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c  eTemp(pParse, p,
1cab0 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20   piFreeable);.  
1cac0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72  }else{.    *piFr
1cad0 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  eeable = 0;.    
1cae0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  if( p->op==TK_SE
1caf0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 52  LECT ){.      iR
1cb00 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1cb10 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1cb20 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20  rse, p, 0, 0);. 
1cb30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cb40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65  int i;.      iRe
1cb50 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
1cb60 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
1cb70 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1cb80 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  sult;.      for(
1cb90 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=0; i<nResult; 
1cba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
1cbb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
1cbc0 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20  torable(pParse, 
1cbd0 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1cbe0 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c  .pExpr, i+iResul
1cbf0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1cc00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
1cc10 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Result;.}.../*.*
1cc20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cc30 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1cc40 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
1cc50 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
1cc60 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
1cc70 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
1cc80 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1cc90 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
1cca0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
1ccb0 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
1ccc0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
1ccd0 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
1cce0 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
1ccf0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
1cd00 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
1cd10 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
1cd20 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1cd30 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
1cd40 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
1cd50 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
1cd60 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
1cd70 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
1cd80 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1cd90 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
1cda0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1cdb0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
1cdc0 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
1cdd0 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
1cde0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cdf0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
1ce00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1ce10 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1ce20 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1ce30 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ce40 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
1ce50 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1ce60 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
1ce90 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1cea0 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
1ceb0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
1cec0 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
1ced0 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
1cee0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1cef0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1cf00 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1cf10 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1cf20 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1cf30 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
1cf40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1cf50 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1cf60 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1cf70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
1cf80 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
1cf90 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
1cfa0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
1cfb0 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cfd0 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
1cfe0 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  sion node */.  i
1cff0 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73  nt p5 = 0;..  as
1d000 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1d010 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1d020 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1d030 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
1d040 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1d050 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1d060 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d070 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
1d080 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1d090 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1d0a0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1d0b0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1d0c0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1d0d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1d0e0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1d0f0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1d100 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1d110 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1d120 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1d130 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1d140 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1d150 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1d160 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1d170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d180 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1d190 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1d1a0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1d1b0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1d1c0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1d1d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1d1e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d1f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1d200 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1d210 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d230 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1d240 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1d250 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1d260 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1d270 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1d280 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1d290 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1d2a0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1d2b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d2c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1d2d0 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1d2e0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1d2f0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1d300 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
1d310 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
1d320 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1d330 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1d340 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1d350 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1d360 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1d370 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1d380 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
1d390 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
1d3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d3b0 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1d3c0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1d3d0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1d3e0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1d3f0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1d400 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1d410 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1d420 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1d430 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1d440 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1d450 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1d460 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
1d470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1d480 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1d490 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1d4a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1d4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1d4e0 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d510 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1d520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1d530 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1d540 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1d550 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1d560 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1d570 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d590 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1d5a0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1d5b0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1d5c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d5d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d5e0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d5f0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1d600 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d610 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1d620 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1d630 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1d640 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1d650 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1d660 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d670 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d680 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d690 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1d6a0 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1d6b0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1d6c0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1d6d0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1d6e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1d6f0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d710 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1d720 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d730 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1d740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d750 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1d760 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1d770 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1d780 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d790 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1d7a0 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1d7b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d7c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d7d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d7e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d7f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1d800 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1d810 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1d820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d830 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1d840 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1d850 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1d860 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1d870 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d880 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1d890 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1d8a0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d8b0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1d8c0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1d8d0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1d8e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d8f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1d900 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1d910 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1d920 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1d930 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1d940 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d950 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1d960 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d970 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d980 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1d990 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1d9a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d9b0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1d9c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d9d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1d9e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d9f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1da00 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1da10 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1da20 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1da30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1da40 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1da50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1da60 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
1da70 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
1da80 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f  List, pExpr->iCo
1da90 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  lumn);.        a
1daa0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1dab0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c  zToken[0]=='?' |
1dac0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1dad0 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20  u.zToken, z)==0 
1dae0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
1daf0 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30  e->pVList[0] = 0
1db00 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c  ; /* Indicate VL
1db10 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65  ist may no longe
1db20 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  r be enlarged */
1db30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1db40 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
1db50 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41  (char*)z, P4_STA
1db60 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1db70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1db80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1db90 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1dba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
1dbb0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1dbc0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1dbd0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1dbe0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1dbf0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1dc00 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1dc10 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1dc20 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1dc30 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1dc40 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1dc50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1dc60 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1dc70 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1dc80 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1dc90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dca0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1dcb0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1dcc0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1dcd0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1dce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1dcf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1dd00 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1dd30 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1dd40 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1dd50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1dd60 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1dd70 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1dd80 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1dd90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1dda0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1ddb0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1ddc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  ;.      return i
1ddd0 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  nReg;.    }.#end
1dde0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ddf0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1de00 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1de10 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
1de20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1de30 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1de40 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20  _NE;.      p5 = 
1de50 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1de60 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72       /* fall-thr
1de70 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
1de80 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1de90 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1dea0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1deb0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1dec0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1ded0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1dee0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1def0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1df00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1df10 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29  rIsVector(pLeft)
1df20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1df30 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50  VectorCompare(pP
1df40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1df50 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20  get, op, p5);.  
1df60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1df80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1df90 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1dfa0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1dfb0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dfc0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1dfd0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dfe0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1dff0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e000 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45  Parse, pLeft, pE
1e010 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1e020 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
1e030 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
1e040 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29  TE_STOREP2 | p5)
1e050 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e060 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1e070 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e080 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1e090 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1e0a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0b0 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1e0c0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e0d0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1e0e0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1e0f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e100 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1e110 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e120 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1e130 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1e140 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e150 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1e160 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e170 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1e180 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1e190 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e1a0 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1e1b0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e1c0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1e1d0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1e1e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e1f0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1e200 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e210 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1e220 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1e230 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e240 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e250 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1e260 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e270 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1e280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e290 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
1e2a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
1e2b0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1e2c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1e2d0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
1e2e0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
1e2f0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
1e300 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
1e310 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
1e320 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1e330 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
1e340 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
1e350 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
1e360 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
1e370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e380 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
1e390 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e3a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
1e3b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e3c0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
1e3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
1e3e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e3f0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1e400 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
1e410 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
1e420 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e430 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
1e440 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
1e450 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
1e460 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e470 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
1e480 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e490 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
1e4a0 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
1e4b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
1e4c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e4d0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
1e4e0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
1e4f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1e500 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
1e510 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
1e520 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
1e530 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e540 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
1e550 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
1e560 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
1e570 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
1e580 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
1e590 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e5a0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
1e5b0 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
1e5c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
1e5d0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1e5e0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
1e5f0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
1e600 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1e610 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
1e620 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
1e630 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
1e640 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e650 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
1e660 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e670 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e680 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e690 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e6a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1e6b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e6c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e6d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1e6e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1e6f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e700 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1e710 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1e720 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e730 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e740 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e750 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e770 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1e780 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1e790 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1e7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1e7b0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1e7c0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1e7d0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1e7e0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1e7f0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1e800 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e810 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e830 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e840 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1e850 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1e860 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1e870 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e880 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e890 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e8a0 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1e8b0 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1e8c0 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1e8d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e8e0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1e8f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e900 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1e910 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1e920 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1e930 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1e940 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1e950 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1e960 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1e970 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e980 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e990 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1e9a0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1e9b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e9c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e9d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e9e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1e9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ea00 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1ea10 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1ea20 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1ea30 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1ea40 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1ea50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ea60 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1ea70 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
1ea80 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
1ea90 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
1eaa0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
1eab0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1eac0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
1ead0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
1eae0 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
1eaf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1eb00 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
1eb10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1eb20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1eb30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1eb40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1eb50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1eb60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1eb70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eb80 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1eb90 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1eba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ebb0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1ebc0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1ebd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1ebe0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1ebf0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1ec00 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1ec10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1ec20 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1ec30 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1ec40 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1ec50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1ec60 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1ec70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ec80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1ec90 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1eca0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ecb0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ecc0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ecd0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ece0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ecf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1ed00 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1ed10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1ed20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1ed30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ed40 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1ed50 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ed60 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1ed70 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1ed80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ed90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1eda0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1edb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1edc0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1edd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ede0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1edf0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1ee00 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1ee10 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1ee20 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1ee30 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1ee40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ee50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ee60 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ee70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1ee80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ee90 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1eea0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1eeb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1eec0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1eed0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1eee0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1eef0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1ef00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1ef10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ef20 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1ef30 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1ef40 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1ef50 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1ef60 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ef70 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1ef80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ef90 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1efa0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1efb0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1efc0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1efd0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1efe0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1eff0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1f000 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1f010 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1f020 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
1f030 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
1f040 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1f050 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1f060 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
1f070 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
1f080 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1f090 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f0a0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
1f0b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1f0c0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
1f0d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1f0e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
1f0f0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
1f100 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1f110 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
1f120 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
1f130 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
1f140 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
1f150 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
1f160 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
1f170 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
1f180 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
1f190 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1f1a0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
1f1b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1f1c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
1f1d0 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
1f1e0 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
1f1f0 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
1f200 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
1f210 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
1f220 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
1f230 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
1f240 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
1f250 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1f260 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1f270 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f280 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
1f290 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f2a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f2b0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1f2c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
1f2d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f2e0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1f2f0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1f300 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1f310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1f320 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1f330 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1f340 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
1f350 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
1f360 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
1f370 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f380 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1f390 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1f3a0 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
1f3b0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
1f3c0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1f3d0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
1f3e0 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
1f3f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1f400 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
1f410 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
1f420 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
1f430 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
1f440 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
1f450 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
1f460 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
1f470 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
1f480 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
1f490 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
1f4a0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
1f4b0 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
1f4c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f4d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f4e0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
1f4f0 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
1f500 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f510 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f520 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
1f530 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
1f540 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
1f550 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
1f560 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
1f570 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
1f580 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
1f590 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
1f5a0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
1f5b0 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
1f5c0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
1f5d0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
1f5e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
1f5f0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1f600 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
1f610 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
1f620 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
1f630 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f640 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f650 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
1f660 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
1f670 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f680 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
1f690 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1f6a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1f6b0 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
1f6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1f6d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f6e0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
1f6f0 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
1f700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
1f710 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1f720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f730 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1f740 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
1f750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f760 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f770 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1f780 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f790 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
1f7a0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
1f7b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f7c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f7d0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1f7e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f7f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f800 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1f810 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1f820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f830 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
1f840 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
1f850 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1f860 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
1f870 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
1f880 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
1f890 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
1f8a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
1f8b0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1f8c0 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
1f8d0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
1f8e0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
1f8f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f900 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f910 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1f920 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1f930 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f940 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1f950 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
1f960 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
1f970 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
1f980 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
1f990 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
1f9a0 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
1f9b0 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1f9c0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
1f9d0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1f9e0 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
1f9f0 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
1fa00 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
1fa10 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1fa20 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fa30 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
1fa40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1fa50 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
1fa60 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
1fa70 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
1fa80 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
1fa90 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
1faa0 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
1fab0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1fac0 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
1fad0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1fae0 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
1faf0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1fb00 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1fb10 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1fb20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
1fb50 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
1fb60 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
1fb70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1fb80 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
1fb90 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
1fba0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
1fbb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
1fbc0 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
1fbd0 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
1fbe0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
1fbf0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1fc00 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
1fc10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
1fc20 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
1fc30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1fc40 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
1fc50 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fc60 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1fc70 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
1fc80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
1fc90 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1fca0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1fcb0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
1fcc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1fcd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1fce0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
1fcf0 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
1fd00 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
1fd10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1fd20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1fd30 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
1fd40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fd50 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
1fd60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1fd70 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
1fd80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1fd90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
1fda0 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
1fdb0 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
1fdc0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
1fdd0 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
1fde0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
1fdf0 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
1fe00 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
1fe10 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1fe20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
1fe30 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
1fe40 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
1fe50 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
1fe60 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
1fe70 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
1fe80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1fe90 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1fea0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
1feb0 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
1fec0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
1fed0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
1fee0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
1fef0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1ff00 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
1ff10 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
1ff20 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
1ff30 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
1ff40 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
1ff50 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
1ff60 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
1ff70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
1ff80 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
1ff90 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1ffa0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
1ffb0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
1ffc0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1ffd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1ffe0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1fff0 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
20000 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
20010 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
20020 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
20030 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
20040 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
20050 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
20060 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
20070 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20080 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
20090 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
200a0 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
200b0 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
200c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
200d0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
200e0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
200f0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
20100 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
20110 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
20120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
20130 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
20140 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
20150 20 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 53 51 4c 49              SQLI
20170 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
20180 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
20190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
201a0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
201b0 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
201c0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
201d0 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
201e0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
201f0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
20200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
20210 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
20220 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
20230 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
20240 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
20250 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
20260 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
20270 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
20280 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
20290 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
202a0 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
202b0 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
202c0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
202d0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
202e0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
202f0 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
20300 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
20310 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
20320 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
20330 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
20340 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
20350 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
20360 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
20370 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
20380 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
20390 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
203a0 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
203b0 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
203c0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
203d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
203e0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
203f0 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
20400 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
20410 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
20420 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
20430 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
20440 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
20450 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
20460 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
20470 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
20480 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
20490 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
204a0 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
204b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
204c0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
204d0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
204e0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
204f0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
20500 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
20510 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
20520 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
20530 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
20540 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
20550 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
20560 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
20570 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
20580 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
20590 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
205a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
205b0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
205c0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
205d0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
205e0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
205f0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
20600 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
20610 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
20620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20630 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
20640 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
20650 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
20660 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
20670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20680 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
20690 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  ion0, constMask,
206a0 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
206d0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
206e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
206f0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
20700 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
20710 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
20720 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
20730 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
20740 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
20750 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
20760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
20770 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20780 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20790 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
207a0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
207b0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
207c0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
207d0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
207e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
207f0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
20800 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
20810 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
20820 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
20830 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
20840 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
20850 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
20860 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
20870 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
20880 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
20890 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
208a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
208b0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
208c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
208d0 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
208e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
208f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20900 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
20910 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
20920 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
20930 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d  ->pLeft->iTable=
20940 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
20950 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
20960 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  le = sqlite3Code
20970 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
20980 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20990 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
209a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
209b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
209c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
209d0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
209e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
209f0 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26  >iTable.       &
20a00 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  & pExpr->iTable!
20a10 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  =(n = sqlite3Exp
20a20 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
20a30 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20  r->pLeft)) .    
20a40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20a50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20a60 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
20a70 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
20a80 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
20ab0 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ble, n);.      }
20ac0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
20ad0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
20ae0 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c  le + pExpr->iCol
20af0 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  umn;.    }.    c
20b00 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
20b10 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
20b20 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
20b30 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20b40 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
20b50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
20b60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20b80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
20b90 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
20ba0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20bb0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
20bc0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
20bd0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
20be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20bf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
20c00 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
20c10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20c20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20c30 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
20c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20c50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
20c60 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
20c70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20c80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
20c90 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
20ca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
20cb0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
20cc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
20cd0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
20ce0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
20cf0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
20d00 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
20d10 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
20d20 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
20d30 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
20d40 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
20d50 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
20d60 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
20d70 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
20d80 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
20d90 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
20da0 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
20db0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
20dc0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
20dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20de0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
20df0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
20e00 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
20e10 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
20e20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20e30 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
20e40 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
20e50 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
20e60 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
20e70 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
20e80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
20e90 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
20ea0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20eb0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
20ec0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
20ed0 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
20ee0 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
20ef0 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
20f00 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
20f10 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
20f20 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
20f30 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
20f40 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
20f50 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
20f60 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
20f70 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
20f80 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
20f90 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
20fa0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
20fb0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
20fc0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
20fd0 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
20fe0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
20ff0 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
21000 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
21010 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
21020 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
21030 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
21040 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
21050 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
21060 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
21070 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
21080 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
21090 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
210a0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
210b0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
210c0 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
210d0 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
210e0 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
210f0 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
21100 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
21110 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
21120 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
21130 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
21140 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
21150 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
21160 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
21170 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
21180 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
21190 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
211a0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
211b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
211c0 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
211d0 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
211e0 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
211f0 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
21200 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
21210 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
21220 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
21230 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
21240 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
21250 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
21260 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
21270 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
21280 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
21290 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
212a0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
212b0 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
212c0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
212d0 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
212e0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
212f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21300 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
21310 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
21320 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
21330 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
21340 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
21350 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
21360 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
21370 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
21380 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
21390 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
213a0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
213b0 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
213c0 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
213d0 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
213e0 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
213f0 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
21400 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
21410 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
21420 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
21430 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
21440 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
21450 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
21460 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
21470 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
21480 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
21490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
214a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
214b0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
214c0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
214d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
214e0 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
214f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
21500 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
21510 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
21520 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
21530 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
21540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21550 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
21560 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
21570 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21580 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
21590 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
215a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
215b0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
215c0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
215d0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
215e0 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
215f0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
21600 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
21610 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
21620 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
21630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
21640 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
21650 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
21660 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
21670 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
21680 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
21690 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
216a0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
216b0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
216c0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
216d0 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
216e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
216f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
21700 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
21710 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
21720 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
21730 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
21740 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
21750 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
21760 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
21770 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21780 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
21790 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
217a0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
217b0 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
217c0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
217d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
217e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
217f0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
21800 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
21810 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21820 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
21830 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
21840 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
21850 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21860 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
21870 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
21880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
21890 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
218a0 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
218b0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
218c0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
218d0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
218e0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
218f0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
21900 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
21910 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
21920 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
21930 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
21940 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
21950 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
21960 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
21970 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
21980 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
21990 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
219a0 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
219b0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
219c0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
219d0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
219e0 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
219f0 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
21a00 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
21a10 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
21a20 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
21a30 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
21a40 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
21a50 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
21a60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
21a70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
21a80 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
21a90 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
21aa0 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
21ab0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
21ac0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
21ad0 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
21ae0 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
21af0 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
21b00 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
21b10 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
21b20 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
21b30 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
21b40 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
21b50 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
21b60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21b70 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
21b80 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
21b90 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
21ba0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
21bb0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
21bc0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
21bd0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
21be0 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
21bf0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
21c00 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
21c10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
21c20 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
21c30 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
21c40 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
21c50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
21c60 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
21c70 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
21c80 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
21c90 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
21cc0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
21cd0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
21ce0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d00 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
21d10 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
21d20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21d50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21d60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
21d70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
21d80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
21d90 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
21da0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
21db0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
21dc0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
21dd0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
21de0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
21df0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
21e00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
21e10 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
21e20 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
21e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21e50 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
21e60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
21e70 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
21e80 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
21e90 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
21ea0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
21eb0 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
21ec0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
21ed0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
21ee0 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
21ef0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
21f00 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
21f10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
21f20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
21f30 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
21f40 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
21f50 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
21f60 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
21f70 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
21f80 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
21f90 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
21fa0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
21fb0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
21fc0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
21fd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21fe0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
21ff0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
22000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
22010 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
22020 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
22030 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
22040 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
22050 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
22060 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
22070 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
22080 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
22090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
220a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
220b0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
220c0 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
220d0 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
220e0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
220f0 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
22100 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
22110 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
22120 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
22130 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
22140 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
22150 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
22160 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
22170 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
22180 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
22190 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
221a0 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
221b0 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
221c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
221d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
221e0 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
221f0 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
22200 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
22210 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
22220 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
22230 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
22240 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
22250 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22260 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
22270 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
22280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22290 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
222a0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
222b0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
222c0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
222d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
222e0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
222f0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
22300 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
22310 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
22320 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
22330 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
22340 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
22350 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
22360 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
22370 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22380 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
22390 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
223a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
223b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
223c0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
223d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
223e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
223f0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
22400 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
22410 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22420 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22430 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
22440 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
22450 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
22460 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
22470 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
22480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22490 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
224a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
224b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
224c0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
224d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
224e0 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
224f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
22500 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
22510 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
22520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22530 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
22540 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
22550 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22560 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22570 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
22580 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
225a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
225b0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
225c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
225d0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
225e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
225f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
22600 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
22610 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
22620 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
22630 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
22640 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22650 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
22660 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22670 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
22680 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
22690 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
226a0 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
226b0 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
226c0 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
226d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
226e0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
226f0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
22700 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
22710 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
22720 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
22730 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
22740 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
22750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
22760 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
22770 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
22780 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22790 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
227a0 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
227b0 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
227c0 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
227d0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
227e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
227f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22800 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
22810 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
22820 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22830 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
22840 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22850 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
22860 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
22870 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
22880 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
22890 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
228a0 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
228b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
228c0 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
228d0 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
228e0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
228f0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
22900 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
22910 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
22920 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
22940 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
22950 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
22960 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
22970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22990 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
229a0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
229b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
229c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
229d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
229e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
229f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
22a00 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
22a10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
22a20 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
22a30 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
22a40 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
22a50 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
22a60 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
22a70 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
22a80 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
22a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65  ..**.** If regDe
22aa0 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72  st>=0 then the r
22ab0 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
22ac0 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72  stored in that r
22ad0 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a  egister and the.
22ae0 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  ** result is not
22af0 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72   reusable.  If r
22b00 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68  egDest<0 then th
22b10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72  is routine is fr
22b20 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20  ee to .** store 
22b30 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65  the value wheree
22b40 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54  ver it wants.  T
22b50 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
22b60 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
22b70 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
22b80 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65  s returned.  Whe
22b90 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f  n regDest<0, two
22ba0 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65   identical expre
22bb0 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63  ssions will.** c
22bc0 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ode to the same 
22bd0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
22be0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22bf0 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
22c00 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
22c10 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22c20 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
22c30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
22c40 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
22c50 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
22c60 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
22c70 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20  nt regDest      
22c80 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
22c90 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
22ca0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
22cb0 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65  rList *p;.  asse
22cc0 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  rt( ConstFactorO
22cd0 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70  k(pParse) );.  p
22ce0 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
22cf0 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67  tExpr;.  if( reg
22d00 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20  Dest<0 && p ){. 
22d10 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
22d20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
22d30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
22d40 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
22d50 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
22d60 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
22d70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22d80 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
22d90 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
22da0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
22db0 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
22dc0 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
22dd0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
22de0 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
22df0 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73  .  }.  pExpr = s
22e00 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
22e10 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
22e20 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
22e30 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
22e40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
22e50 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
22e60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
22e70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
22e80 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
22e90 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
22ea0 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44  >reusable = regD
22eb0 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20  est<0;.     if( 
22ec0 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44  regDest<0 ) regD
22ed0 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  est = ++pParse->
22ee0 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d  nMem;.     pItem
22ef0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
22f00 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d  g = regDest;.  }
22f10 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
22f20 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74  tExpr = p;.  ret
22f30 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a  urn regDest;.}..
22f40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
22f50 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
22f60 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
22f70 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
22f80 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
22f90 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
22fa0 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
22fb0 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
22fc0 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
22fd0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22fe0 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
22ff0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
23000 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
23010 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
23020 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
23030 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
23040 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
23050 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
23060 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
23070 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
23080 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
23090 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
230a0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
230b0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65  routine might ge
230c0 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63  nerate this.** c
230d0 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ode to fill the 
230e0 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
230f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
23100 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ection of the.**
23110 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69   VDBE program, i
23120 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f  n order to facto
23130 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  r it out of the 
23140 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e  evaluation loop.
23150 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
23160 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
23170 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
23180 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
23190 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20  g){.  int r2;.  
231a0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
231b0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
231c0 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e  Expr);.  if( Con
231d0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
231e0 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  e).   && pExpr->
231f0 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a  op!=TK_REGISTER.
23200 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
23210 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
23220 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20  in(pExpr).  ){. 
23230 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
23240 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23250 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
23260 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
23270 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23280 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
23290 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
232a0 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
232b0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
232c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
232d0 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
232e0 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
232f0 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
23300 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
23310 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23320 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
23330 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
23340 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23350 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
23360 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
23370 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
23380 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
23390 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
233a0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
233b0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
233c0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
233d0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
233e0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
233f0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
23400 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
23410 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
23420 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
23430 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
23440 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
23450 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
23460 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
23470 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
23480 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
23490 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
234a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
234b0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
234c0 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
234d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
234e0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
234f0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
23500 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
23510 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
23520 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
23530 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
23540 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  dbe!=0 || pParse
23550 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23560 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
23570 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
23580 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
23590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
235a0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
235b0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
235c0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
235d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
235e0 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73  .** Make a trans
235f0 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70  ient copy of exp
23600 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
23610 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75  d then code it u
23620 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45  sing.** sqlite3E
23630 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73  xprCode().  This
23640 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a   routine works j
23650 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  ust like sqlite3
23660 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78  ExprCode().** ex
23670 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e  cept that the in
23680 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
23690 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
236a0 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  be unchanged..*/
236b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
236c0 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
236d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
236e0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
236f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23700 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23710 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23720 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
23730 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  r, 0);.  if( !db
23740 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23750 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23760 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23770 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74  target);.  sqlit
23780 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
23790 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
237a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
237b0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
237c0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
237d0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
237e0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
237f0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
23800 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
23810 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
23820 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
23830 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
23840 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
23850 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
23860 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
23870 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
23880 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
23890 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
238a0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
238b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
238c0 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
238d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
238e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
238f0 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
23900 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
23910 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
23920 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
23930 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
23940 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
23950 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
23960 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
23970 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
23980 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23990 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
239a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
239b0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
239c0 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
239d0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
239e0 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
239f0 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
23a00 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
23a10 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
23a20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
23a30 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
23a40 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
23a50 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
23a60 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
23a70 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
23a80 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
23a90 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
23aa0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
23ab0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
23ac0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
23ad0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
23ae0 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
23af0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
23b00 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
23b10 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
23b20 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
23b30 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
23b40 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
23b50 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
23b60 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
23b70 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
23b80 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
23b90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
23ba0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
23bb0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
23bc0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
23bd0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
23be0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
23bf0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
23c00 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
23c10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23c20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
23c30 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
23c40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23c50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
23c60 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
23c70 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
23c80 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
23c90 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
23ca0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23cb0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
23cc0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
23cd0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
23ce0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
23cf0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
23d00 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
23d10 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
23d20 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
23d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23d40 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
23d50 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
23d60 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
23d70 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
23d80 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
23d90 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
23da0 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
23db0 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
23dc0 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
23dd0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
23de0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
23df0 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
23e00 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
23e10 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
23e20 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
23e30 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
23e40 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
23e50 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
23e60 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
23e70 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
23e80 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
23e90 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
23ea0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
23eb0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
23ec0 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
23ed0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
23ee0 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
23ef0 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
23f00 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
23f10 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
23f20 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23f30 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
23f40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23f50 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23f60 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
23f70 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
23f80 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
23f90 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
23fa0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
23fb0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
23fc0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
23fd0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
23fe0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
23ff0 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
24000 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
24010 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
24020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
24030 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
24040 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
24050 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24060 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
24070 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
24080 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24090 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
240a0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
240b0 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
240c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
240d0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
240e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
240f0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
24100 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
24110 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
24120 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
24130 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
24140 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
24150 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
24160 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
24170 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
24180 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
24190 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
241a0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
241b0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
241c0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
241d0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
241e0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
241f0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
24200 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d  0 && (j = pItem-
24210 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
24220 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  )>0 ){.      if(
24230 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
24240 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a  ECEL_OMITREF ){.
24250 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
24260 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
24270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24290 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72  (v, copyOp, j+sr
242a0 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69  cReg-1, target+i
242b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
242c0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
242d0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
242e0 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
242f0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24300 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
24310 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24320 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
24330 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
24340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24350 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
24360 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24370 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24380 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
24390 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
243a0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
243b0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
243c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70  .        if( cop
243d0 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  yOp==OP_Copy.   
243e0 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71        && (pOp=sq
243f0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
24400 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  , -1))->opcode==
24410 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
24420 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
24430 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20  >p3+1==inReg.   
24440 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
24450 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67  +pOp->p3+1==targ
24460 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  et+i.        ){.
24470 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
24480 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  3++;.        }el
24490 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
244a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
244b0 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67  v, copyOp, inReg
244c0 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
244d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
244e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
244f0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
24500 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24510 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
24520 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
24530 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
24540 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
24550 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
24560 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
24570 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
24580 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
24590 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
245a0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
245b0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69  xpression.** eli
245c0 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  mination of x..*
245d0 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66  *.** The xJumpIf
245e0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
245f0 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a  mines details:.*
24600 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20  *.**    NULL:   
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61  Store the boolea
24630 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b  n result in reg[
24640 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69  dest].**    sqli
24650 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20  te3ExprIfTrue:  
24660 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
24670 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73   if true.**    s
24680 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24690 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64  e:     Jump to d
246a0 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a  est if false.**.
246b0 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c  ** The jumpIfNul
246c0 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  l parameter is i
246d0 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49  gnored if xJumpI
246e0 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  f is NULL..*/.st
246f0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
24700 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
24710 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
24720 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
24730 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
24740 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
24750 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
24760 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
24770 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
24780 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
24790 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
247a0 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63  n or storage loc
247b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
247c0 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c  (*xJump)(Parse*,
247d0 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20  Expr*,int,int), 
247e0 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b  /* Action to tak
247f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
24800 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
24810 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
24820 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
24830 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70   */.){. Expr exp
24840 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
24850 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
24860 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
24870 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
24880 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
24890 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
248a0 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
248b0 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
248c0 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
248d0 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
248e0 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
248f0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
24900 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
24910 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
24920 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d  ister */...  mem
24930 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30  set(&compLeft, 0
24940 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
24950 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52  .  memset(&compR
24960 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ight, 0, sizeof(
24970 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
24980 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69  (&exprAnd, 0, si
24990 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
249a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
249b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
249c0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
249d0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
249e0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
249f0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
24a00 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
24a10 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
24a20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
24a30 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
24a40 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
24a50 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
24a60 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
24a70 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
24a80 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
24a90 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
24aa0 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
24ab0 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
24ac0 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
24ad0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
24ae0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
24af0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
24b00 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
24b10 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70  ster(&exprX, exp
24b20 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
24b30 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
24b40 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78  Free1));.  if( x
24b50 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d  Jump ){.    xJum
24b60 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  p(pParse, &exprA
24b70 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
24b80 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
24b90 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
24ba0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65  expression is be
24bb0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ing from the ON 
24bc0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
24bd0 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a  of a join.    **
24be0 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c   so that the sql
24bf0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
24c00 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  et() routine wil
24c10 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
24c20 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20   move.    ** it 
24c30 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70  into the Parse.p
24c40 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20  ConstExpr list. 
24c50 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61   We should use a
24c60 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69   new bit for thi
24c70 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c  s,.    ** for cl
24c80 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72  arity, but we ar
24c90 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e  e out of bits in
24ca0 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20   the Expr.flags 
24cb0 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20  field so we.    
24cc0 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65  ** have to reuse
24cd0 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
24ce0 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a   bit.  Bummer. *
24cf0 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67  /.    exprX.flag
24d00 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  s |= EP_FromJoin
24d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
24d20 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
24d30 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
24d40 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
24d50 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24d60 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
24d70 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
24d80 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
24d90 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
24da0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24db0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
24dc0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
24dd0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
24de0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24df0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24e00 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
24e10 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
24e20 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
24e30 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24e40 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24e50 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
24e60 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
24e70 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24e80 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24e90 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
24ea0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
24eb0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24ec0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24ed0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
24ee0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
24ef0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
24f00 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
24f10 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24f20 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
24f30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
24f40 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24f50 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24f60 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24f70 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
24f80 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
24f90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
24fa0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24fb0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
24fc0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
24fd0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
24fe0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
24ff0 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Jump==0 );.}../*
25000 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25010 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
25020 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
25030 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
25040 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
25050 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
25060 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
25070 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
25080 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
25090 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
250a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
250b0 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
250c0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
250d0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
250e0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
250f0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
25100 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
25110 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
25120 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
25130 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
25140 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
25150 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
25160 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
25170 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
25180 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
25190 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
251a0 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
251b0 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
251c0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
251d0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
251e0 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
251f0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
25200 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
25210 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
25220 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
25230 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
25240 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
25250 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
25260 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
25270 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
25280 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
25290 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
252a0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
252b0 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
252c0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
252d0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
252e0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
252f0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
25300 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
25310 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
25320 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25330 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
25340 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
25350 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
25360 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
25370 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
25380 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25390 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
253a0 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
253b0 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
253c0 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
253d0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
253e0 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
253f0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
25400 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
25410 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
25420 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
25430 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
25440 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
25450 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
25460 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25470 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
25480 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
25490 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
254a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
254b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
254c0 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
254d0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
254e0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
254f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
25500 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
25510 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25520 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
25530 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
25540 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
25560 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
25570 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
25580 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
25590 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
255a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
255b0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
255c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
255d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
255e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
255f0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25600 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
25610 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25630 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
25640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25650 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
25660 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25670 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25680 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
25690 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
256a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
256b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
256c0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
256d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
256e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
256f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25700 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25710 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
25720 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25740 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
25750 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
25760 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
25770 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
25780 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25790 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
257a0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
257b0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
257c0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
257d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
257e0 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
257f0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
25800 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
25810 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
25820 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
25830 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
25840 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
25850 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
25860 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
25870 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
25880 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
25890 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
258a0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
258b0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
258c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
258d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
258e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
258f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
25900 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
25910 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
25920 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
25930 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
25940 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
25950 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
25960 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25970 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
25980 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
25990 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
259a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
259b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
259c0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
259d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
259e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
259f0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
25a00 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
25a10 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
25a20 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
25a30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25a40 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
25a50 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
25a60 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
25a70 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
25a80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25a90 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
25aa0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
25ab0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
25ac0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
25ad0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
25ae0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
25af0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
25b00 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
25b10 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
25b20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25b30 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
25b40 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
25b50 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25b60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25b70 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
25b80 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25b90 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25ba0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
25bb0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
25bc0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
25bd0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25be0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
25bf0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
25c00 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
25c10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
25c20 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
25c30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25c40 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
25c50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25c60 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25c70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25c80 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
25c90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25ca0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
25cb0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
25cc0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
25cd0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
25ce0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
25cf0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
25d00 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
25d10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
25d20 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
25d30 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
25d40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
25d50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
25d60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
25d70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
25d80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
25d90 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
25da0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
25db0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
25dc0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25dd0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
25de0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
25df0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
25e00 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
25e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25e20 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25e40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
25e50 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
25e60 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25e70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
25e80 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
25e90 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
25ea0 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
25eb0 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
25ec0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
25ed0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
25ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25ef0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
25f00 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
25f10 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
25f20 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
25f30 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
25f40 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
25f50 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
25f60 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
25f70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25f80 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
25f90 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
25fa0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
25fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25fc0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
25fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25fe0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
25ff0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
26000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26010 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
26020 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
26030 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
26040 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
26050 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
26060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26070 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
26080 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
26090 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
260a0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
260b0 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
260c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
260d0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
260e0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
260f0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
26100 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
26110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26120 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
26130 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
26140 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
26150 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
26160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26170 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26180 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26190 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
261a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
261b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
261c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
261d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
261e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
261f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26200 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26210 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
26220 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
26230 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
26240 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
26250 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
26260 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
26270 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
26280 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
26290 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
262a0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
262b0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
262c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
262d0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
262e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
262f0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
26300 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
26310 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
26320 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
26330 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
26340 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
26350 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
26360 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
26370 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26380 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
26390 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
263a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
263b0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
263c0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
263d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
263e0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
263f0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
26400 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
26410 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
26420 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
26430 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26440 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
26450 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26460 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
26470 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
26480 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
26490 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
264a0 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
264b0 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
264c0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
264d0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
264e0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
264f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
26500 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
26510 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
26520 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
26530 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
26540 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
26550 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
26560 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
26570 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
26580 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
26590 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
265a0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
265c0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
265d0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
265e0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
265f0 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
26600 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
26610 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
26620 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
26630 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26650 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
26660 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
26670 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
26680 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
26690 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
266a0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
266b0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
266c0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
266d0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
266e0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
266f0 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
26700 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
26710 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
26720 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
26730 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
26740 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
26750 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
26760 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
26770 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
26780 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
26790 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
267a0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
267b0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
267c0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
267d0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
267e0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
267f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
26800 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
26810 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
26820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
26830 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
26840 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
26850 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
26860 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
26870 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
26880 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
26890 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
268a0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
268b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
268c0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
268d0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
268e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
268f0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
26900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
26910 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
26920 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
26930 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
26940 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
26950 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
26960 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
26970 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
26980 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26990 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
269a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
269b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
269c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
269d0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
269e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
269f0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
26a00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
26a10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26a20 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26a30 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
26a40 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26a50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26a60 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26a80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
26a90 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
26aa0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
26ab0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26ad0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26af0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26b00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
26b10 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
26b20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26b30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26b40 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
26b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26b60 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26b70 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26b80 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26b90 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
26ba0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
26bb0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
26bc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26bd0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
26be0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26bf0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
26c00 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
26c10 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26c20 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
26c30 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26c40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26c50 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26c60 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26c70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26c80 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
26c90 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
26ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
26cb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
26cc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26cd0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
26ce0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
26cf0 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
26d00 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
26d10 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
26d20 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
26d30 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
26d40 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
26d50 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
26d60 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
26d70 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
26d80 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26d90 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26da0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26db0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26dc0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26dd0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
26de0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
26df0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26e00 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26e10 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26e20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26e30 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26e40 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26e50 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
26e60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26e70 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26e80 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26e90 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26ea0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26eb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
26ec0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
26ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ee0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
26ef0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26f00 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
26f10 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
26f20 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
26f30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26f40 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
26f50 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
26f60 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
26f70 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
26f80 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26f90 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
26fa0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
26fb0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
26fc0 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
26fd0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26fe0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
26ff0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
27000 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27010 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
27020 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27030 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
27040 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
27050 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27060 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
27070 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27080 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
27090 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
270a0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
270b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
270c0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
270d0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
270e0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
270f0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
27100 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
27110 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
27120 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27130 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27140 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
27150 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27160 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27170 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27180 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27190 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
271a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
271b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
271c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
271d0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
271e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
271f0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27200 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27210 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
27220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
27230 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
27240 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
27250 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
27260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27270 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
27280 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27290 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
272a0 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
272b0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
272c0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
272d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
272e0 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
272f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27300 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
27310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
27320 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
27330 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27340 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
27350 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
27360 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27370 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
27380 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
27390 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
273a0 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
273b0 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
273c0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
273d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
273e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
273f0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
27400 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
27410 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
27420 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27430 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27440 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
27450 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
27460 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
27470 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
27480 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
27490 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
274a0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
274b0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
274c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
274d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
274e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
274f0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
27500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
27510 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27520 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27530 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27540 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  : .      if( exp
27550 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
27560 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
27570 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
27580 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
27590 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
275a0 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
275b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
275c0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
275d0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
275e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
275f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27600 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
27610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27620 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
27630 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
27640 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
27650 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
27660 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
27670 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27680 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27690 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
276a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
276b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
276c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
276d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
276e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
276f0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
27700 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27710 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
27720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
27730 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27740 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
27750 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
27760 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
27770 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
27780 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
27790 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
277a0 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
277b0 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
277c0 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
277d0 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
277e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
277f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
27800 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
27810 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
27820 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
27830 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
27840 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
27850 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
27860 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
27870 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
27880 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
27890 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
278a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
278b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
278c0 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
278d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
278e0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
278f0 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
27900 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
27910 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
27920 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
27930 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
27940 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
27950 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
27960 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
27970 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
27980 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
27990 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
279a0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
279b0 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
279c0 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
279d0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
279e0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
279f0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
27a00 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
27a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
27a20 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
27a30 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
27a40 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
27a50 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
27a60 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
27a70 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
27a80 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
27a90 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
27aa0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
27ab0 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
27ac0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
27ad0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
27ae0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
27af0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
27b00 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
27b10 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
27b20 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
27b30 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
27b40 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
27b50 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
27b60 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
27b70 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
27b80 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
27b90 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
27ba0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
27bb0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
27bc0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
27bd0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
27be0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
27bf0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
27c00 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
27c10 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
27c20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
27c30 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
27c40 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
27c50 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
27c60 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
27c70 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
27c80 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
27c90 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
27ca0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
27cb0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
27cc0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
27cd0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
27ce0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
27cf0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
27d00 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
27d10 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
27d20 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
27d30 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
27d40 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
27d50 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
27d60 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
27d70 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
27d80 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
27d90 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
27da0 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
27db0 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
27dc0 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
27dd0 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
27de0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
27df0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
27e00 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
27e10 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
27e20 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
27e30 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
27e40 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
27e50 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
27e60 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
27e70 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
27e80 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
27e90 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
27ea0 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
27eb0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
27ec0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
27ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
27ee0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
27ef0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
27f00 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
27f10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
27f20 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
27f30 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
27f40 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
27f50 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
27f60 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
27f70 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
27f80 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
27f90 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
27fa0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
27fb0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
27fc0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
27fd0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
27fe0 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
27ff0 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
28000 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  n ){.    if( pA-
28010 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
28020 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
28030 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
28040 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
28050 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
28060 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
28070 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
28080 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
28090 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
280a0 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
280b0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
280c0 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
280d0 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
280e0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
280f0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
28100 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
28110 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
28120 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
28130 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
28140 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
28150 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
28160 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
28170 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
28180 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
28190 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
281a0 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
281b0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
281c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
281d0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
281e0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
281f0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
28200 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
28210 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
28220 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
28230 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
28240 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
28250 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
28260 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
28270 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
28280 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
28290 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
282a0 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
282b0 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
282c0 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
282d0 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
282e0 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
282f0 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
28300 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
28310 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
28320 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
28330 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
28340 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
28350 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
28360 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
28370 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
28380 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
28390 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
283a0 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
283b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
283c0 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
283d0 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
283e0 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
283f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
28400 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
28410 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
28420 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
28430 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
28440 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
28450 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
28460 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
28470 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
28480 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
28490 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
284a0 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
284b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
284c0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
284d0 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
284e0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
284f0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
28500 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
28510 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
28520 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
28530 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
28540 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
28550 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
28560 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
28570 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
28580 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
28590 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
285a0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
285b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
285c0 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
285d0 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
285e0 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
285f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
28600 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
28610 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
28620 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
28630 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
28640 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
28650 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
28660 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
28670 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
28680 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
28690 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
286a0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
286b0 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
286c0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
286d0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
286e0 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
286f0 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
28700 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28710 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
28720 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
28730 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
28740 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28750 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
28760 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20  e3ExprCompare() 
28770 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f  except COLLATE o
28780 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
28790 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65  top-level.** are
287a0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
287b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
287c0 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41  areSkip(Expr *pA
287d0 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
287e0 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  iTab){.  return 
287f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
28800 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  re(.            
28810 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
28820 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20 20  Collate(pA),.   
28830 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28840 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
28850 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20  (pB),.          
28860 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a     iTab);.}../*.
28870 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
28880 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74  f we can prove t
28890 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61  he pE2 will alwa
288a0 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45  ys be true if pE
288b0 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52  1 is.** true.  R
288c0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77  eturn false if w
288d0 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74  e cannot complet
288e0 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69  e the proof or i
288f0 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62  f pE2 might.** b
28900 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c  e false.  Exampl
28910 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45  es:.**.**     pE
28920 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45  1: x==5       pE
28930 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
28940 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
28950 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30  .**     pE1: x>0
28960 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d          pE2: x==
28970 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
28980 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
28990 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20     pE1: x=21    
289a0 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20     pE2: x=21 OR 
289b0 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a  y=43     Result:
289c0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
289d0 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32  : x!=123     pE2
289e0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
289f0 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
28a00 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f  **     pE1: x!=?
28a10 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  1      pE2: x IS
28a20 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
28a30 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
28a40 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20   pE1: x IS NULL 
28a50 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
28a60 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66  ULL    Result: f
28a70 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
28a80 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a   x IS ?2    pE2:
28a90 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
28aa0 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a    Reuslt: false.
28ab0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61  **.** When compa
28ac0 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  ring TK_COLUMN n
28ad0 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31  odes between pE1
28ae0 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32   and pE2, if pE2
28af0 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61   has.** Expr.iTa
28b00 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d  ble<0 then assum
28b10 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  e a table number
28b20 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a   given by iTab..
28b30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
28b40 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
28b50 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
28b60 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
28b70 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
28b80 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
28b90 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
28ba0 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
28bb0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
28bc0 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
28bd0 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
28be0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
28bf0 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
28c00 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
28c10 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
28c20 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45  iesExpr(Expr *pE
28c30 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e  1, Expr *pE2, in
28c40 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73  t iTab){.  if( s
28c50 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
28c60 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62  e(pE1, pE2, iTab
28c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
28c80 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
28c90 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
28ca0 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
28cb0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
28cc0 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
28cd0 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab).            
28ce0 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
28cf0 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
28d00 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  pE2->pRight, iTa
28d10 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  b) ).  ){.    re
28d20 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
28d30 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  ( pE2->op==TK_NO
28d40 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70  TNULL && pE1->op
28d50 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70  !=TK_ISNULL && p
28d60 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b  E1->op!=TK_IS ){
28d70 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
28d80 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
28d90 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65 66  ollate(pE1->pLef
28da0 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
28db0 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74  ( pX!=pE1->pLeft
28dc0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
28dd0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
28de0 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  X, pE2->pLeft, i
28df0 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tab)==0 ) return
28e00 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
28e10 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
28e20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
28e30 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
28e40 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
28e50 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
28e60 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
28e70 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
28e80 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
28e90 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f   by reference to
28ea0 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e   the.** index on
28eb0 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69  ly, without havi
28ec0 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63  ng to do a searc
28ed0 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  h for the corres
28ee0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
28ef0 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78   entry.  The Idx
28f00 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64  Cover.pIdx field
28f10 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20   is the index.  
28f20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a  IdxCover.iCur.**
28f30 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
28f40 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  or the table..*/
28f50 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72  .struct IdxCover
28f60 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78   {.  Index *pIdx
28f70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  ;     /* The ind
28f80 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
28f90 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
28fa0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
28fb0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
28fc0 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
28fd0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
28fe0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  to the index */.
28ff0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  };../*.** Check 
29000 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
29010 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  are references t
29020 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
29030 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  le .** pWalker->
29040 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
29050 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  r can be satisfi
29060 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
29070 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  ex.** pWalker->u
29080 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
29090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
290a0 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c  exprIdxCover(Wal
290b0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
290c0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
290d0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
290e0 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78  COLUMN.   && pEx
290f0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
29100 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
29110 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c  ->iCur.   && sql
29120 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
29130 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  x(pWalker->u.pId
29140 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45  xCover->pIdx, pE
29150 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a  xpr->iColumn)<0.
29160 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72    ){.    pWalker
29170 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
29180 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29190 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
291a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
291b0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
291c0 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64   if an index pId
291d0 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20  x on table with 
291e0 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74  cursor iCur cont
291f0 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65  ains will.** the
29200 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
29210 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
29220 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65  if the index doe
29230 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65  s cover the.** e
29240 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61  xpression and fa
29250 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72  lse if the pExpr
29260 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65   expression refe
29270 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c  rences table col
29280 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  umns.** that are
29290 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68   not found in th
292a0 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  e index pIdx..**
292b0 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76  .** An index cov
292c0 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  ering an express
292d0 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ion means that t
292e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
292f0 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65  n be.** evaluate
29300 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65  d using only the
29310 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f   index and witho
29320 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f  ut having to loo
29330 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  kup the.** corre
29340 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65  sponding table e
29350 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ntry..*/.int sql
29360 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
29370 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a  yIndex(.  Expr *
29380 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
29390 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
293a0 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
293b0 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
293c0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e   /* The cursor n
293d0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f  umber for the co
293e0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
293f0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
29400 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx         /* Th
29410 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67  e index that mig
29420 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63  ht be used for c
29430 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  overage */.){.  
29440 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
29450 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76  ct IdxCover xcov
29460 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
29470 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
29480 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72  xcov.iCur = iCur
29490 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20  ;.  xcov.pIdx = 
294a0 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43  pIdx;.  w.xExprC
294b0 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64  allback = exprId
294c0 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49  xCover;.  w.u.pI
294d0 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b  dxCover = &xcov;
294e0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
294f0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20  pr(&w, pExpr);. 
29500 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65   return !w.eCode
29510 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.}.../*.** An i
29520 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
29530 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
29540 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
29550 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
29560 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
29570 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
29580 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
29590 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
295a0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
295b0 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
295c0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
295d0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
295e0 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
295f0 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
29600 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
29610 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
29620 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
29630 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
29640 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
29650 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
29660 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
29670 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
29680 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
29690 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
296a0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
296b0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
296c0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
296d0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
296e0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
296f0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
29700 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
29710 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
29720 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
29730 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
29740 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
29750 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
29760 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
29770 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
29780 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
29790 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
297a0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
297b0 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
297c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
297d0 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
297e0 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
297f0 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
29800 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
29810 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
29820 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
29830 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
29840 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
29850 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
29860 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
29870 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
29880 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
29890 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
298a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
298b0 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
298c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
298d0 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
298e0 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
298f0 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
29900 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
29910 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
29920 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
29930 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
29940 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
29950 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
29960 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
29970 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
29980 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
29990 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
299a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
299b0 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
299c0 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
299d0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
299e0 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
299f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29a00 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
29a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
29a20 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
29a30 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
29a40 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
29a50 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
29a60 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
29a70 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
29a80 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
29a90 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
29aa0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
29ab0 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
29ac0 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
29ad0 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
29ae0 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
29af0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
29b00 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
29b10 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
29b20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
29b30 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
29b40 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
29b50 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
29b60 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
29b70 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
29b80 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
29b90 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
29ba0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
29bb0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
29bc0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
29bd0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
29be0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
29bf0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
29c00 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
29c10 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
29c20 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
29c30 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
29c40 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
29c50 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
29c60 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
29c70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
29c80 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
29c90 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
29ca0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
29cb0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
29cc0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
29cd0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
29ce0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
29cf0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
29d00 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
29d10 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
29d20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
29d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
29d40 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
29d50 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
29d60 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
29d70 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
29d80 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
29d90 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
29da0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
29db0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
29dc0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
29dd0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
29de0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
29df0 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
29e00 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
29e10 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
29e20 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
29e30 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
29e40 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
29e50 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
29e60 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
29e70 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
29e80 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
29e90 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
29ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
29eb0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
29ec0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
29ed0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
29ee0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
29ef0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
29f00 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
29f10 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
29f20 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
29f30 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
29f40 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
29f50 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
29f60 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
29f70 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
29f80 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
29f90 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
29fa0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
29fb0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
29fc0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
29fd0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
29fe0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
29ff0 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
2a000 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a010 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
2a020 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2a030 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2a040 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2a050 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
2a060 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2a070 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
2a080 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
2a090 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
2a0a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a0b0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
2a0c0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
2a0d0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
2a0e0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
2a0f0 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
2a100 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
2a110 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2a120 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2a130 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2a140 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2a150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a160 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2a170 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2a180 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2a190 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2a1a0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2a1b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2a1c0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2a1d0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2a1e0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2a1f0 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2a200 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2a210 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2a220 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2a230 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2a240 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2a250 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2a260 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2a270 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2a280 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2a290 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2a2a0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2a2b0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2a2c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a2d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a2e0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2a2f0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2a300 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2a310 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2a320 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2a330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a340 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2a350 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2a360 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2a370 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2a380 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2a390 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2a3a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2a3b0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2a3c0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2a3d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2a3e0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2a3f0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2a400 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2a410 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2a420 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2a430 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2a440 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2a450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a460 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2a470 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2a480 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2a490 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2a4a0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2a4b0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2a4c0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2a4d0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2a4e0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2a4f0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2a500 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a510 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2a520 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2a530 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2a540 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2a550 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2a560 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a570 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2a580 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2a590 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2a5a0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2a5b0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2a5c0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2a5d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a5e0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2a5f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2a600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a610 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2a620 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
2a630 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
2a640 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
2a650 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
2a660 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2a670 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
2a680 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2a690 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
2a6a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2a6c0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2a6d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2a6e0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
2a6f0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2a700 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
2a710 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
2a720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a730 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
2a740 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
2a750 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
2a760 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a780 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2a790 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
2a7a0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
2a7b0 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
2a7c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2a7d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2a7e0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
2a7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a800 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2a810 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2a830 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
2a840 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
2a850 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2a860 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2a870 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
2a880 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2a890 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a8b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2a8c0 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
2a8d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2a8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a920 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2a930 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
2a940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a950 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2a960 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
2a970 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
2a980 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
2a990 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a9a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
2a9b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
2a9c0 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
2a9d0 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
2a9e0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
2a9f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
2aa00 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
2aa10 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
2aa20 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
2aa30 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
2aa40 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
2aa50 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
2aa60 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
2aa70 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
2aa80 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
2aa90 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2aaa0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
2aab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2aac0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2aad0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2aae0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2aaf0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2ab00 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2ab10 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
2ab20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
2ab30 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
2ab40 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2ab50 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
2ab60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2ab70 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
2ab80 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
2ab90 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2aba0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
2abb0 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
2abc0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
2abd0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2abe0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2abf0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
2ac00 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
2ac10 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
2ac20 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
2ac30 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
2ac40 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
2ac50 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
2ac60 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
2ac70 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2ac80 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
2ac90 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
2aca0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
2acb0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
2acc0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
2acd0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
2ace0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
2acf0 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
2ad00 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2ad10 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
2ad20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
2ad30 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
2ad40 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2ad50 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
2ad60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2ad70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2ad80 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
2ad90 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
2ada0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2adb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2adc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2add0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
2ade0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
2adf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
2ae00 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
2ae10 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
2ae20 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
2ae30 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
2ae40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
2ae50 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
2ae60 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
2ae70 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
2ae80 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
2ae90 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
2aea0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
2aeb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2aec0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2aed0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2aee0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2af00 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
2af10 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
2af20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
2af30 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2af40 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
2af50 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
2af60 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
2af70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2af80 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2af90 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
2afa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2afb0 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
2afc0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
2afd0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2aff0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
2b000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b010 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
2b020 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
2b030 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
2b040 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
2b050 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2b060 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
2b070 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
2b080 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2b090 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
2b0a0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2b0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b0c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2b0d0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b0f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b100 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
2b110 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
2b120 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
2b130 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
2b140 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
2b150 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
2b160 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2b170 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2b180 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2b190 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
2b1a0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2b1b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2b1c0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2b1d0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2b1e0 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
2b1f0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
2b200 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
2b210 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2b220 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
2b230 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
2b240 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2b250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b260 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2b270 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2b280 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2b290 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
2b2a0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2b2b0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2b2c0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b2d0 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a  METER(pWalker);.
2b2e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b2f0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  ER(pSelect);.  r
2b300 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2b310 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  ue;.}../*.** Ana
2b320 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
2b330 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
2b340 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
2b350 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
2b360 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
2b370 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
2b380 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
2b390 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
2b3a0 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
2b3b0 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
2b3c0 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
2b3d0 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
2b3e0 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
2b3f0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2b400 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2b410 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2b420 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
2b430 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
2b440 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
2b450 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
2b460 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
2b470 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2b480 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2b490 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
2b4a0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
2b4b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2b4c0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
2b4d0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
2b4e0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
2b4f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
2b500 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2b510 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
2b520 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
2b530 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
2b540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
2b550 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
2b560 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2b570 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
2b580 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
2b590 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2b5a0 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
2b5b0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
2b5c0 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
2b5d0 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
2b5e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2b5f0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
2b600 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
2b610 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
2b620 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
2b630 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2b640 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2b650 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2b660 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
2b670 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
2b680 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2b690 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
2b6a0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2b6b0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
2b6c0 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
2b6d0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
2b6e0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
2b6f0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2b700 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
2b710 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2b720 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2b730 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
2b740 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
2b750 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
2b760 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
2b770 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
2b780 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2b790 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2b7a0 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
2b7b0 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
2b7c0 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
2b7d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
2b7e0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
2b7f0 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
2b800 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
2b810 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
2b820 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
2b830 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
2b840 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
2b850 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
2b860 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
2b870 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
2b880 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
2b890 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
2b8a0 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
2b8b0 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
2b8c0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
2b8d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2b8e0 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
2b8f0 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
2b900 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
2b910 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2b920 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
2b930 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2b940 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
2b950 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
2b960 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
2b970 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
2b980 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
2b990 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
2b9a0 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
2b9b0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
2b9c0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
2b9d0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
2b9e0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
2b9f0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
2ba00 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
2ba10 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
2ba20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
2ba30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ba40 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2ba50 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
2ba60 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
2ba70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2ba80 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
2ba90 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
2baa0 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
2bab0 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  gisters..*/.int 
2bac0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2bad0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2bae0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
2baf0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
2bb00 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e  nReg==1 ) return
2bb10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2bb20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20  eg(pParse);.  i 
2bb30 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
2bb40 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
2bb50 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
2bb60 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
2bb70 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
2bb80 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
2bb90 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
2bba0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
2bbb0 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
2bbc0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
2bbd0 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
2bbe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
2bbf0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2bc00 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
2bc10 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
2bc20 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
2bc30 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2bc40 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
2bc50 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2bc60 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
2bc70 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
2bc80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2bc90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2bca0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74  , iReg);.    ret
2bcb0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
2bcc0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
2bcd0 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
2bce0 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
2bcf0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
2bd00 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
2bd10 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
2bd20 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2bd30 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
2bd40 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2bd50 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
2bd60 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
2bd70 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
2bd80 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
2bd90 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
2bda0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
2bdb0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2bdc0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2bdd0 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2bde0 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
2bdf0 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65  ../*.** Validate
2be00 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61   that no tempora
2be10 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c  ry register fall
2be20 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
2be30 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e  ge of.** iFirst.
2be40 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
2be50 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2be60 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72   is only call fr
2be70 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
2be80 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
2be90 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2bea0 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2beb0 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
2bec0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2bed0 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e  , int iFirst, in
2bee0 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20  t iLast){.  int 
2bef0 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
2bf00 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20  >nRangeReg>0.   
2bf10 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2bf20 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61  eReg+pParse->nRa
2bf30 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20  ngeReg<iLast.   
2bf40 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2bf50 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29  eReg>=iFirst.  )
2bf60 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
2bf70 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2bf80 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  i<pParse->nTempR
2bf90 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  eg; i++){.    if
2bfa0 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  ( pParse->aTempR
2bfb0 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26  eg[i]>=iFirst &&
2bfc0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2bfd0 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  g[i]<=iLast ){. 
2bfe0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2bff0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c000 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2c010 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2c020 0a                                               .