/ Hex Artifact Content
Login

Artifact 8fd6b7bc10c2c33e017b0f2715efdc83c01e348be27797022ed9eaa3002ca720:


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 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  eNN(db, p);.  }.
8720: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
8730: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
8740: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8750: 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65    if( p ) sqlite
8760: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8770: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
8780: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8790: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
87a0: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
87b0: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
87c0: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
87d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
87e0: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
87f0: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
8800: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
8810: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
8820: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8830: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
8840: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
8850: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8860: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8870: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8880: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
8890: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
88a0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
88b0: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
88c0: 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  d) ) return EXPR
88d0: 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20  _REDUCEDSIZE;.  
88e0: 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c  return EXPR_FULL
88f0: 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  SIZE;.}../*.** T
8900: 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a  he dupedExpr*Siz
8910: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63  e() routines eac
8920: 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  h return the num
8930: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
8940: 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72  uired.** to stor
8950: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  e a copy of an e
8960: 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70  xpression or exp
8970: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54  ression tree.  T
8980: 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a  hey differ in.**
8990: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65   how much of the
89a0: 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65   tree is measure
89b0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70  d..**.**     dup
89c0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
89d0: 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f  ()     Size of o
89e0: 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72  nly the Expr str
89f0: 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64  ucture .**     d
8a00: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
8a10: 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66  ()       Size of
8a20: 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f   Expr + space fo
8a30: 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64  r token.**     d
8a40: 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20  upedExprSize()  
8a50: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20           Expr + 
8a60: 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20  token + subtree 
8a70: 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a  components.**.**
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 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
8ad0: 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72  The dupedExprStr
8ae0: 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69  uctSize() functi
8af0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76  on returns two v
8b00: 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65  alues OR-ed toge
8b10: 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74  ther:  .** (1) t
8b20: 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
8b30: 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20  d for a copy of 
8b40: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8b50: 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20  re only and .** 
8b60: 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66  (2) the EP_xxx f
8b70: 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
8b80: 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75  te what the stru
8b90: 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c  cture size shoul
8ba0: 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  d be..** The ret
8bb0: 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c  urn values is al
8bc0: 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  ways one of:.**.
8bd0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c  **      EXPR_FUL
8be0: 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58  LSIZE.**      EX
8bf0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20  PR_REDUCEDSIZE  
8c00: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a   | EP_Reduced.**
8c10: 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e        EXPR_TOKEN
8c20: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
8c30: 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68  kenOnly.**.** Th
8c40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74  e size of the st
8c50: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66  ructure can be f
8c60: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
8c70: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
8c80: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74  .** of this rout
8c90: 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20  ine with 0xfff. 
8ca0: 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62   The flags can b
8cb0: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
8cc0: 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ng the.** return
8cd0: 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52   value with EP_R
8ce0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
8cf0: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  nly..**.** Note 
8d00: 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d  that with flags=
8d10: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c  =EXPRDUP_REDUCE,
8d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77   this routines w
8d30: 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a  orks on full-siz
8d40: 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29  e.** (unreduced)
8d50: 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73   Expr objects as
8d60: 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61   they or origina
8d70: 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lly constructed 
8d80: 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a  by the parser..*
8d90: 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73  * During express
8da0: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78  ion analysis, ex
8db0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
8dc0: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
8dd0: 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61  moved into.** la
8de0: 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68  ter parts of teh
8df0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64   Expr object and
8e00: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
8e10: 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65  rmation might ge
8e20: 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66  t chopped.** off
8e30: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
8e40: 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  on is reduced.  
8e50: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69  Note also that i
8e60: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
8e70: 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58  to.** make an EX
8e80: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
8e90: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
8ea0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
8eb0: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
8ec0: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
8ed0: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
8ee0: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
8ef0: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
8f00: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
8f10: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8f20: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
8f30: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
8f40: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
8f50: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
8f60: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
8f70: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
8f80: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
8f90: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
8fa0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
8fb0: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
8fc0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
8fd0: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
8fe0: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
8ff0: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
9000: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
9010: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
9020: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
9030: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
9040: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9050: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
9060: 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73  ;.  if( 0==flags
9070: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45   || p->op==TK_SE
9080: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  LECT_COLUMN ){. 
9090: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
90a0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
90b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
90c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
90d0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
90e0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
90f0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9110: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
9120: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9130: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9140: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
9150: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9160: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9170: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
9180: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
9190: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
91a0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
91b0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
91c0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
91d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91e0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
91f0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
9200: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
9210: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9220: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
9230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
9240: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9250: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9260: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
9270: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9280: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9290: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
92a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
92b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
92c0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
92d0: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
92e0: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
92f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9300: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9310: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9320: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9330: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9340: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
9350: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
9360: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9370: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
9380: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
9390: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
93a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
93b0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
93c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
93d0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
93e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
93f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9400: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
9410: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
9420: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
9430: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9440: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9450: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
9460: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
9470: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
9480: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
9490: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
94a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
94b0: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
94c0: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
94d0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
94e0: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
94f0: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
9500: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
9510: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
9520: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
9530: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
9540: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
9550: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
9560: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
9570: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
9580: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
9590: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
95a0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
95b0: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
95c0: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
95d0: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
95e0: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
95f0: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
9600: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
9610: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
9620: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
9630: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
9640: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
9650: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9660: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9670: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
9680: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
9690: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
96a0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
96b0: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
96c0: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
96d0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
96e0: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
96f0: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
9700: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
9710: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
9720: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9730: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
9740: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9750: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
9760: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
9770: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
9780: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
9790: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
97a0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
97b0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
97c0: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
97d0: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
97e0: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
97f0: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
9800: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
9810: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
9820: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
9830: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
9840: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
9850: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
9860: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
9870: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
9880: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
9890: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
98a0: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
98b0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
98c0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
98d0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
98e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
98f0: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
9900: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
9910: 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38  int dupFlags, u8
9920: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
9930: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9940: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
9950: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38  o return */.  u8
9960: 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20   *zAlloc;       
9970: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
9980: 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ace from which t
9990: 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a  o build Expr obj
99a0: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61  ect */.  u32 sta
99b0: 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  ticFlag;       /
99c0: 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73  * EP_Static if s
99d0: 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65  pace not obtaine
99e0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
99f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
9a00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9a10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75   );.  assert( du
9a20: 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70  pFlags==0 || dup
9a30: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9a40: 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72  EDUCE );.  asser
9a50: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
9a60: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
9a70: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20  DUP_REDUCE );.. 
9a80: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
9a90: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
9aa0: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
9ab0: 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ture. */.  if( p
9ac0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a  zBuffer ){.    z
9ad0: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
9ae0: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  r;.    staticFla
9af0: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
9b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c   }else{.    zAll
9b10: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
9b20: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75  llocRawNN(db, du
9b30: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64  pedExprSize(p, d
9b40: 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73  upFlags));.    s
9b50: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20  taticFlag = 0;. 
9b60: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70   }.  pNew = (Exp
9b70: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69  r *)zAlloc;..  i
9b80: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f  f( pNew ){.    /
9b90: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
9ba0: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
9bb0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
9bc0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
9bd0: 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77  o.    ** by pNew
9be0: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
9bf0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
9c00: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
9c10: 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f   or.    ** EXPR_
9c20: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
9c30: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
9c40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9c50: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
9c60: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
9c70: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
9c80: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
9c90: 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  y)..    */.    c
9ca0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
9cb0: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
9cc0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9cd0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
9ce0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
9cf0: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
9d00: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
9d10: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
9d20: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
9d30: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
9d40: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
9d50: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f  ken ){.      nTo
9d60: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
9d70: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
9d80: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73  n) + 1;.    }els
9d90: 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  e{.      nToken 
9da0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
9db0: 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20  f( dupFlags ){. 
9dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
9dd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9de0: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
9df0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
9e00: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
9e10: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
9e20: 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20        u32 nSize 
9e30: 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63  = (u32)exprStruc
9e40: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
9e50: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
9e60: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
9e70: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
9e80: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
9e90: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
9ea0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
9eb0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
9ec0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9ed0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
9ee0: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
9ef0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
9f00: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
9f10: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
9f20: 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  /.    pNew->flag
9f30: 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65  s &= ~(EP_Reduce
9f40: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
9f50: 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54  P_Static|EP_MemT
9f60: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  oken);.    pNew-
9f70: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
9f80: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
9f90: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
9fa0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
9fb0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
9fc0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
9fd0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
9fe0: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
9ff0: 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e  /.    if( nToken
a000: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
a010: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
a020: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
a030: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
a040: 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e];.      memcpy
a050: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
a060: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
a070: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
a080: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
a090: 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54  ->flags) & (EP_T
a0a0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
a0b0: 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  )) ){.      /* F
a0c0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
a0d0: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
a0e0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
a0f0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
a100: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a110: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
a120: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a130: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
a140: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a150: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
a160: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a180: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a190: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a1a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
a1b0: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
a1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a1d0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
a1e0: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
a1f0: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
a200: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a210: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a220: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a230: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
a240: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a250: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a260: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a270: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a280: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a290: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
a2a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a2b0: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
a2c0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a2d0: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a2e0: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
a2f0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a300: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a310: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
a320: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
a330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a340: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a350: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
a360: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a370: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a380: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a390: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
a3a0: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
a3b0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  Alloc;.      }. 
a3c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3d0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a3e0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
a3f0: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
a410: 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  w->op==TK_SELECT
a420: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
a430: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
a440: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
a450: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a460: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
a470: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
a480: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a490: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20  ( p->pRight==0  
a4a0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d  || p->pRight==p-
a4b0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
a4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a4d0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a4f0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
a500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a510: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a520: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a530: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a540: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
a550: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a560: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
a570: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
a580: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
a590: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
a5a0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
a5b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
a5c0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
a5d0: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
a5e0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
a5f0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
a600: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
a610: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
a620: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a630: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
a640: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
a650: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
a660: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
a670: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
a680: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
a690: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
a6a0: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
a6b0: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
a6c0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
a6d0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
a6e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
a6f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
a700: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
a710: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
a720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a730: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
a740: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
a750: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
a760: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
a770: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
a780: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
a790: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
a7a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a7b0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
a7c0: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
a7d0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
a7e0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
a7f0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
a800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
a810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a820: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
a830: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
a840: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
a850: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a860: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
a870: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
a880: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
a890: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
a8a0: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
a8b0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
a8c0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
a8d0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
a8e0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
a8f0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
a900: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
a910: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
a920: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
a930: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
a940: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
a950: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a960: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
a970: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
a980: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
a990: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
a9a0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
a9b0: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
a9c0: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
a9d0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
a9e0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
a9f0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
aa00: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
aa10: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
aa20: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
aa30: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
aa40: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
aa50: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
aa60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
aa70: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
aa80: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
aa90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
aaa0: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
aab0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
aac0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
aad0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
aae0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
aaf0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
ab00: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
ab10: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
ab20: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
ab30: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
ab40: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
ab50: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
ab60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
ab70: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
ab80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
ab90: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
aba0: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
abb0: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
abc0: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
abd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
abe0: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
abf0: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
ac00: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
ac10: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
ac20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ac30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
ac40: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
ac50: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
ac60: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
ac70: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
ac80: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
ac90: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  m;.  int i;.  Ex
aca0: 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74  pr *pPriorSelect
acb0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Col = 0;.  asser
acc0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
acd0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
ace0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
acf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
ad00: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
ad10: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29     sizeof(*pNew)
ad20: 2b 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 5b  +sizeof(pNew->a[
ad30: 30 5d 29 2a 28 70 2d 3e 6e 45 78 70 72 2d 31 29  0])*(p->nExpr-1)
ad40: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
ad50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ad60: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
ad70: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
ad80: 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d  nExpr;.  pItem =
ad90: 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64   pNew->a;.  pOld
ada0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
adb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
adc0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
add0: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
ade0: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
adf0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
ae00: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
ae10: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74  NewExpr;.    pIt
ae20: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
ae30: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ae40: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
ae50: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
ae60: 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45  r .     && pOldE
ae70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ae80: 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  CT_COLUMN.     &
ae90: 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49  & (pNewExpr = pI
aea0: 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a  tem->pExpr)!=0 .
aeb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
aec0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
aed0: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30  Column==0 || i>0
aee0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   );.      if( pN
aef0: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
af00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
af10: 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e  sert( pOldExpr->
af20: 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d  pLeft==pOldExpr-
af30: 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  >pRight );.     
af40: 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43     pPriorSelectC
af50: 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ol = pNewExpr->p
af60: 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d  Left = pNewExpr-
af70: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
af80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
af90: 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
afa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
afb0: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20  em[-1].pExpr!=0 
afc0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
afd0: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
afe0: 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  lumn==pItem[-1].
aff0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31  pExpr->iColumn+1
b000: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b010: 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74  rt( pPriorSelect
b020: 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  Col==pItem[-1].p
b030: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
b040: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
b050: 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53  >pLeft = pPriorS
b060: 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20  electCol;.      
b070: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  }.    }.    pIte
b080: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
b090: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b0a0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
b0b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
b0c0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
b0d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b0e0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
b0f0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
b100: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
b110: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
b120: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
b130: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
b140: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70   = pOldItem->bSp
b150: 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74  anIsTab;.    pIt
b160: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
b170: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
b180: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
b190: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
b1a0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
b1b0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
b1c0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
b1d0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
b1e0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
b1f0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b200: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
b210: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
b220: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
b230: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
b240: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
b250: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
b260: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
b270: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
b280: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b290: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
b2a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b2b0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
b2c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b2d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
b2e0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
b2f0: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
b300: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
b310: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b320: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
b330: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
b340: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
b350: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b360: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b370: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b380: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
b390: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
b3a0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
b3b0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
b3c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b3d0: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
b3e0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b3f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b400: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
b410: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
b420: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
b430: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
b440: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b450: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
b460: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
b470: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b480: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
b490: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
b4a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
b4b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
b4c0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
b4d0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
b4e0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
b4f0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b500: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b510: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
b520: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
b530: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b540: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
b560: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
b570: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b580: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b590: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
b5a0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
b5b0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
b5c0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
b5d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
b5e0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
b5f0: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
b600: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
b610: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
b620: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
b630: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
b640: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
b650: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
b660: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
b670: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
b680: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
b690: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b6a0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
b6b0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
b6c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
b6d0: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
b6e0: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
b6f0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
b700: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
b710: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
b720: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
b730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b740: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
b750: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
b760: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
b770: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
b780: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
b790: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
b7a0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
b7b0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
b7c0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
b7d0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
b7e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b7f0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b800: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
b810: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b820: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
b830: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
b840: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
b850: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b860: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
b870: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
b880: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
b890: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
b8a0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
b8b0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
b8c0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
b8d0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
b8e0: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
b8f0: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
b900: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
b910: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
b920: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
b930: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b940: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
b950: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b960: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
b970: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
b980: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
b990: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
b9a0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
b9b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
b9c0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
b9d0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
b9e0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
b9f0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
ba00: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
ba10: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
ba20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
ba30: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
ba40: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
ba50: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
ba60: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
ba70: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
ba80: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
ba90: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
baa0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
bab0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
bac0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
bad0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
bae0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
baf0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
bb00: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
bb10: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
bb20: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
bb30: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
bb40: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
bb50: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
bb60: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
bb70: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
bb80: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bb90: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
bba0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
bbb0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
bbc0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
bbd0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
bbe0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bbf0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
bc00: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
bc10: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
bc20: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
bc30: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
bc40: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
bc50: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
bc60: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
bc70: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
bc80: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
bc90: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
bca0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
bcb0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
bcc0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
bcd0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
bce0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
bcf0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
bd00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
bd10: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
bd20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
bd30: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
bd40: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
bd50: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
bd60: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
bd70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bd80: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
bd90: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
bda0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
bdb0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
bdc0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
bdd0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bde0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
bdf0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
be00: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
be10: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
be20: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
be30: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
be40: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
be50: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
be60: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
be70: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
be80: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
be90: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
bea0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
beb0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bec0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
bed0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f  s);.    pNew->pO
bee0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
bef0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
bf00: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
bf10: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
bf20: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
bf30: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
bf40: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
bf50: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
bf60: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
bf70: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
bf80: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
bf90: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
bfa0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
bfb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
bfc0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bfd0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
bfe0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
bff0: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
c000: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c010: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
c020: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
c030: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c040: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c050: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c060: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c070: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c080: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c090: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c0a0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c0b0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c0c0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c0d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c0e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c0f0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c100: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c110: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c120: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c130: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c140: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c150: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c160: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
c170: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
c180: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
c190: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
c1a0: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
c1b0: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
c1c0: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
c1d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
c1e0: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
c1f0: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
c200: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
c210: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
c220: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
c230: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
c240: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
c250: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c260: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c270: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
c280: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
c290: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
c2a0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
c2b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2c0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
c2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c2e0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
c2f0: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
c300: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74   NULL */.){.  st
c310: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c320: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
c330: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c340: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
c350: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
c360: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
c370: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
c380: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c390: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
c3a0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
c3b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  st==0 ){.      g
c3c0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c3d0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78  }.    pList->nEx
c3e0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73  pr = 0;.    pLis
c3f0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
c400: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
c410: 2d 3e 6e 45 78 70 72 3d 3d 70 4c 69 73 74 2d 3e  ->nExpr==pList->
c420: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 45 78  nAlloc ){.    Ex
c430: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
c440: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
c450: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
c460: 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
c470: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
c480: 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 41 6c 6c  )+(2*pList->nAll
c490: 6f 63 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70  oc - 1)*sizeof(p
c4a0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
c4b0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
c4c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
c4d0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
c4e0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ist = pNew;.    
c4f0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
c500: 20 32 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   2;.  }.  pItem 
c510: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c520: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 6d  t->nExpr++];.  m
c530: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
c540: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
c550: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
c560: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
c570: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
c580: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
c590: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
c5a0: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
c5b0: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
c5c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
c5d0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
c5e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c5f0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
c600: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c610: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
c620: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
c630: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
c640: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
c650: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
c660: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
c670: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
c680: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
c690: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
c6a0: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
c6b0: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
c6c0: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
c6d0: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
c6e0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
c6f0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
c700: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
c710: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
c720: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
c730: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
c740: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
c750: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
c760: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
c770: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
c780: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
c790: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
c7a0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
c7b0: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
c7c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c7d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c7e0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c7f0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c800: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
c810: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
c820: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c830: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
c840: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
c850: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
c860: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
c870: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
c880: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
c890: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
c8a0: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
c8b0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c8c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c8d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c8e0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
c8f0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
c900: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
c910: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
c920: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
c930: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
c940: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
c950: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
c960: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
c970: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
c980: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
c990: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
c9a0: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
c9b0: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
c9c0: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
c9d0: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
c9e0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c9f0: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
ca00: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
ca10: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
ca20: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
ca30: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
ca40: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
ca50: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
ca60: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
ca70: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
ca80: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
ca90: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
caa0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
cab0: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
cac0: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
cad0: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
cae0: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
caf0: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
cb00: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
cb10: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
cb20: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
cb30: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
cb40: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
cb50: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
cb60: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
cb70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
cb80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
cb90: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
cba0: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cbc0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
cbd0: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
cbe0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
cbf0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
cc00: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
cc10: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
cc20: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
cc30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
cc40: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
cc50: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
cc60: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
cc70: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
cc80: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
cc90: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
cca0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
ccb0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
ccc0: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
ccd0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
cce0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
ccf0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
cd00: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
cd10: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
cd20: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
cd30: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
cd40: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
cd50: 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 4c 69 73  K_SELECT && pLis
cd60: 74 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  t ){.    Expr *p
cd70: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61  First = pList->a
cd80: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a  [iFirst].pExpr;.
cd90: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
cda0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
cdb0: 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d  ert( pFirst->op=
cdc0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
cdd0: 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f  N );.     .    /
cde0: 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45  * Store the SELE
cdf0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
ce00: 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c  pRight so it wil
ce10: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
ce20: 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  n.    ** sqlite3
ce30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29  ExprListDelete()
ce40: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
ce50: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
ce60: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45   = pExpr;.    pE
ce70: 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  xpr = 0;..    /*
ce80: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69   Remember the si
ce90: 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ze of the LHS in
cea0: 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20   iTable so that 
ceb0: 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61  we can check tha
cec0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53  t.    ** the RHS
ced0: 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d   and LHS sizes m
cee0: 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65  atch during code
cef0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a   generation. */.
cf00: 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62      pFirst->iTab
cf10: 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  le = pColumns->n
cf20: 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f  Id;.  }..vector_
cf30: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
cf40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
cf50: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
cf60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
cf70: 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73  ete(db, pColumns
cf80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
cf90: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
cfa0: 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66  the sort order f
cfb0: 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  or the last elem
cfc0: 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ent on the given
cfd0: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f   ExprList..*/.vo
cfe0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
cff0: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45  stSetSortOrder(E
d000: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
d010: 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69  iSortOrder){.  i
d020: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
d030: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
d040: 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c  TE_SO_UNDEFINED<
d050: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41  0 && SQLITE_SO_A
d060: 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  SC>=0 && SQLITE_
d070: 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61  SO_DESC>0 );.  a
d080: 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e  ssert( p->nExpr>
d090: 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74  0 );.  if( iSort
d0a0: 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61  Order<0 ){.    a
d0b0: 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e  ssert( p->a[p->n
d0c0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
d0d0: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  r==SQLITE_SO_ASC
d0e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
d0f0: 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45    }.  p->a[p->nE
d100: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
d110: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
d120: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
d130: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
d140: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
d150: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
d160: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
d170: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
d180: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
d190: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
d1a0: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
d1b0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
d1c0: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
d1d0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
d1e0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
d1f0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
d200: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
d210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
d220: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
d230: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d240: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
d250: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d260: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d270: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d280: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
d290: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
d2a0: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
d2b0: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
d2c0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
d2d0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
d2e0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
d2f0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
d300: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
d310: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
d320: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
d330: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
d340: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
d350: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d360: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
d370: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
d380: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d390: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
d3a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d3b0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
d3c0: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d3d0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
d3e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
d3f0: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
d400: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
d410: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
d420: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
d430: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
d440: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
d450: 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  te ) sqlite3Dequ
d460: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
d470: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d480: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
d490: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
d4a0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
d4b0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
d4c0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
d4d0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
d4e0: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
d4f0: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
d500: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
d510: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
d520: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
d530: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
d540: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
d550: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
d560: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d570: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
d580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
d590: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
d5a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d5c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d5d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d5e0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
d5f0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
d600: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
d610: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
d620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d630: 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64  span to be added
d640: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d650: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d660: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  b;.  assert( pLi
d670: 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  st!=0 || db->mal
d680: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
d690: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d6a0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d6b0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
d6c0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d6d0: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
d6e0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
d6f0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73  Expr>0 );.    as
d700: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
d710: 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d  Failed || pItem-
d720: 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70  >pExpr==pSpan->p
d730: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
d740: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
d750: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
d760: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
d770: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
d780: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
d790: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d7c0: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
d7d0: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
d7e0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
d7f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d800: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
d810: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
d820: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
d830: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
d840: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d850: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
d860: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
d870: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
d880: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
d890: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
d8a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d8b0: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
d8c0: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
d8d0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
d8e0: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
d8f0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d900: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d910: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
d920: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
d930: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
d940: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
d950: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
d960: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
d970: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d980: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
d990: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
d9a0: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
d9b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
d9c0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
d9d0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on list..*/.stat
d9e0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
d9f0: 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74  NE void exprList
da00: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
da10: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
da20: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20  pList){.  int i 
da30: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
da40: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
da50: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
da60: 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73   pList->a;.  ass
da70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
da80: 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  r>0 );.  do{.   
da90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
daa0: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
dab0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
dac0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
dad0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
dae0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
daf0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
db00: 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d      pItem++;.  }
db10: 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a  while( --i>0 );.
db20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
db30: 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
db40: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
db50: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
db60: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
db70: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
db80: 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74  pList ) exprList
db90: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69  DeleteNN(db, pLi
dba0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
dbb0: 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65  turn the bitwise
dbc0: 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e  -OR of all Expr.
dbd0: 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20  flags fields in 
dbe0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70  the given.** Exp
dbf0: 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71  rList..*/.u32 sq
dc00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
dc10: 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  gs(const ExprLis
dc20: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
dc30: 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b   i;.  u32 m = 0;
dc40: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
dc50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dc60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
dc70: 29 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a  ){.       Expr *
dc80: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
dc90: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
dca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
dcb0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c  =0 );.       m |
dcc0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
dcd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
dce0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
dcf0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
dd00: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
dd10: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
dd20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
dd30: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
dd40: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
dd50: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
dd60: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
dd70: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
dd80: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
dd90: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
dda0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
ddb0: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
ddc0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
ddd0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
dde0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
ddf0: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
de00: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
de10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
de20: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
de30: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
de40: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
de50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
de60: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
de70: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
de80: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
de90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
dea0: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29  sTableConstant()
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
dec0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
ded0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
dee0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
def0: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        p
df00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
df10: 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
df20: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
df30: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
df40: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
df50: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
df60: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
df70: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
df80: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
df90: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
dfa0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
dfb0: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
dfc0: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
dfd0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
dfe0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
dff0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
e000: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
e010: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
e020: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
e030: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
e040: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
e050: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
e060: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
e070: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
e080: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
e090: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
e0a0: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
e0b0: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
e0c0: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
e0d0: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
e0e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e0f0: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
e100: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
e110: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
e120: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
e130: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
e140: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
e150: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
e160: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
e170: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
e180: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
e190: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
e1a0: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
e1b0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
e1c0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
e1d0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
e1e0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
e1f0: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
e200: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
e210: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
e220: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
e230: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
e240: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
e250: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
e260: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
e270: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
e280: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
e290: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
e2a0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
e2b0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
e2c0: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
e2d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
e2e0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
e2f0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
e300: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
e310: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
e320: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
e330: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
e340: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
e350: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
e360: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
e370: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
e380: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
e390: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
e3a0: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
e3b0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
e3c0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
e3d0: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
e3e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
e3f0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
e400: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
e410: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
e420: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
e430: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
e440: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e450: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
e460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e470: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e490: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e4a0: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e4b0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
e4c0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
e4d0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
e4e0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
e4f0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
e500: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e510: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
e520: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e530: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
e540: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
e550: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e560: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
e570: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
e580: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e590: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
e5a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
e5b0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26  lker->eCode==3 &
e5c0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e5d0: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72  =pWalker->u.iCur
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e5f0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e600: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e610: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e620: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e630: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e640: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e650: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
e660: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
e670: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
e680: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
e690: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
e6a0: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
e6b0: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
e6c0: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
e6d0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e6e0: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
e6f0: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
e700: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
e710: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
e720: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
e730: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
e740: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e750: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
e760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
e770: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
e780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
e790: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
e7a0: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
e7b0: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
e7c0: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
e7d0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
e7e0: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
e7f0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
e800: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e810: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e820: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
e840: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
e850: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
e860: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e870: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
e880: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
e890: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
e8a0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
e8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e8c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
e8d0: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
e8e0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
e8f0: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
e900: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
e910: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
e920: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
e930: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e940: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
e950: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
e960: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
e970: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
e980: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
e990: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
e9a0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
e9b0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
e9c0: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
e9d0: 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20  t initFlag, int 
e9e0: 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iCur){.  Walker 
e9f0: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
ea00: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
ea10: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
ea20: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
ea30: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
ea40: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
ea50: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
ea60: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
ea70: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69  onstant;.  w.u.i
ea80: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
ea90: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
eaa0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
eab0: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
eac0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ead0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
eae0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
eaf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
eb00: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
eb10: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
eb20: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
eb30: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
eb40: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
eb50: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
eb60: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
eb70: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
eb80: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
eb90: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
eba0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
ebb0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
ebc0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
ebd0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
ebe0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ebf0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
ec00: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
ec10: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
ec20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
ec30: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
ec40: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
ec50: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
ec60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
ec70: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
ec80: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
ec90: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
eca0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
ecb0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
ecc0: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
ecd0: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
ece0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
ecf0: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
ed00: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
ed10: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
ed20: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
ed30: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
ed40: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
ed50: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
ed60: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
ed70: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
ed80: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
ed90: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
eda0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
edb0: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20  tant.** for any 
edc0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
edd0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
ede0: 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74  sor iCur.  In ot
edf0: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a  her words, the.*
ee00: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  * expression mus
ee10: 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  t not refer to a
ee20: 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ny non-determini
ee30: 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  stic function no
ee40: 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f  r any.** table o
ee50: 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a  ther than iCur..
ee60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ee70: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
ee80: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
ee90: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  Cur){.  return e
eea0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c  xprIsConst(p, 3,
eeb0: 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iCur);.}../*.**
eec0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
eed0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
eee0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
eef0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ef00: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
ef10: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
ef20: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
ef30: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
ef40: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
ef50: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
ef60: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
ef70: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
ef80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
ef90: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
efa0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
efb0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
efc0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
efd0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
efe0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
eff0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
f000: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
f010: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f020: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
f030: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
f040: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
f050: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
f060: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
f070: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
f080: 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
f090: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f0a0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
f0b0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
f0c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
f0d0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
f0e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
f0f0: 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
f100: 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
f110: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
f120: 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
f130: 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
f140: 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
f150: 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
f160: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
f170: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
f180: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
f190: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
f1a0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
f1b0: 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
f1c0: 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
f1d0: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
f1e0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
f1f0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
f200: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
f210: 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
f220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
f230: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f240: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
f250: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
f260: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
f270: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
f280: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
f290: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
f2a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f2b0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
f2c0: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
f2d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
f2e0: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
f2f0: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
f300: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
f310: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
f320: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
f330: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
f340: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
f350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f360: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
f370: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
f380: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
f390: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
f3a0: 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e  rn 0;  /* Can on
f3b0: 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77  ly happen follow
f3c0: 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20  ing on OOM */.. 
f3d0: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
f3e0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
f3f0: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
f400: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
f410: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
f420: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
f430: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
f440: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
f450: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
f460: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
f470: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
f480: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
f490: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
f4a0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
f4b0: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
f4c0: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
f4d0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
f4e0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
f4f0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
f500: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
f510: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
f520: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
f530: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
f540: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
f550: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
f560: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
f570: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
f580: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f590: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
f5a0: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
f5b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f5c0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f5d0: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
f5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
f5f0: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
f600: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
f610: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
f620: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
f630: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f640: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f650: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
f660: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f670: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
f680: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
f690: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
f6a0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
f6b0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
f6c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
f6d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
f6e0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f6f0: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
f700: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
f710: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
f720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f730: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
f740: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
f750: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
f760: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
f770: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
f780: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
f790: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
f7a0: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
f7b0: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
f7c0: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
f7d0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
f7e0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
f7f0: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
f800: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
f810: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
f820: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
f830: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
f840: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
f850: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
f860: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
f870: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
f880: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
f890: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
f8a0: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
f8b0: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
f8c0: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
f8d0: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
f8e0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
f8f0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
f900: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
f910: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
f920: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
f930: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
f940: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
f950: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
f960: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
f970: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
f980: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f990: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
f9a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
f9b0: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
f9c0: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
f9d0: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
f9e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
f9f0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
fa00: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
fa10: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
fa20: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
fa30: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
fa40: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
fa50: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
fa60: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
fa70: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
fa80: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
fa90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
faa0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fab0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
fac0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
fad0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
fae0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
faf0: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
fb00: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
fb10: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
fb20: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
fb30: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
fb40: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
fb50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fb60: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
fb70: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
fb80: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
fb90: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
fba0: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
fbb0: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
fbc0: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
fbd0: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
fbe0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
fbf0: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
fc00: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
fc10: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
fc20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
fc30: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
fc40: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
fc50: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
fc60: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
fc70: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
fc80: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
fc90: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
fca0: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
fcb0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
fcc0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
fcd0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
fce0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
fcf0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
fd00: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
fd10: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fd20: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
fd30: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
fd40: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
fd50: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
fd60: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
fd70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fd80: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
fd90: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
fda0: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
fdb0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
fdc0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
fdd0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
fde0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
fdf0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
fe00: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
fe10: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
fe20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
fe30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fe40: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
fe50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
fe60: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
fe70: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
fe80: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
fe90: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
fea0: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
feb0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
fec0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
fed0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
fee0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
fef0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
ff00: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ff10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
ff20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ff30: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
ff40: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
ff50: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
ff60: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
ff70: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
ff80: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
ff90: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ffa0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
ffb0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
ffc0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ffd0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
ffe0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
fff0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
10000 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
10010 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
10020 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10030 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
10040 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
10050 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
10060 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
10070 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
10080 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
10090 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
100a0 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
100b0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
100c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
100d0 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
100e0 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
100f0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
10100 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10110 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
10120 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
10130 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
10140 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
10150 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
10160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10170 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
10180 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
10190 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
101a0 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
101b0 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
101c0 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
101d0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
101e0 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
101f0 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
10200 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
10210 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
10220 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
10230 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
10240 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10250 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
10260 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
10270 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
10280 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
10290 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
102a0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
102b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
102c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
102d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
102e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
102f0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
10300 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
10310 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
10320 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
10330 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
10340 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
10350 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
10360 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
10370 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
10380 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
10390 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
103a0 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
103b0 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
103c0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
103d0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
103e0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
103f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
10400 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
10410 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
10420 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
10430 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
10440 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10460 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
10470 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
10480 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
10490 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
104a0 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
104b0 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
104c0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
104d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
104e0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
104f0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
10500 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
10510 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
10520 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
10530 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
10540 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10550 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
10560 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
10570 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
10580 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
10590 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
105a0 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
105b0 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
105c0 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
105d0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73  >a[0].pTab;.  as
105e0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
105f0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
10600 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
10610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
10620 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
10630 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
10640 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10650 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
10660 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
10670 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
10680 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
10690 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
106a0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
106b0 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53  =0 );.  /* All S
106c0 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75  ELECT results mu
106d0 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a  st be columns. *
106e0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
106f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10700 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  +){.    Expr *pR
10710 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  es = pEList->a[i
10720 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
10730 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f   pRes->op!=TK_CO
10740 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
10750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
10760 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  s->iTable==pSrc-
10770 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b  >a[0].iCursor );
10780 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65    /* Not a corre
10790 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
107a0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  /.  }.  return p
107b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
107c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
107d0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
107e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
107f0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
10800 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65  te code that che
10810 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  cks the left-mos
10820 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  t column of inde
10830 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20  x table iCur to 
10840 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e  see if.** it con
10850 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65  tains any NULL e
10860 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74  ntries.  Cause t
10870 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72  he register at r
10880 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20  egHasNull to be 
10890 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  set.** to a non-
108a0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43  NULL value if iC
108b0 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ur contains no N
108c0 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67  ULLs.  Cause reg
108d0 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c  ister regHasNull
108e0 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f  .** to be set to
108f0 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f   NULL if iCur co
10900 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
10910 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
10920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10930 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
10940 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e  Flag(Vdbe *v, in
10950 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48  t iCur, int regH
10960 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61  asNull){.  int a
10970 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr1;.  sqlite3V
10980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10990 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48  Integer, 0, regH
109a0 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31  asNull);.  addr1
109b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
109c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
109d0 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
109e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
109f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10a00 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
10a10 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
10a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10a30 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
10a40 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
10a50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10a60 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
10a70 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
10a80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10a90 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
10aa0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
10ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10ac0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
10ad0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
10ae0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
10af0 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  h a list (not a 
10b00 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65  subquery) on the
10b10 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
10b20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  side.  Return TR
10b30 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20  UE if that list 
10b40 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a  is constant..*/.
10b50 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
10b60 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
10b70 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  t(Expr *pIn){.  
10b80 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e  Expr *pLHS;.  in
10b90 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
10ba0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
10bb0 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c  y(pIn, EP_xIsSel
10bc0 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d  ect) );.  pLHS =
10bd0 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70   pIn->pLeft;.  p
10be0 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  In->pLeft = 0;. 
10bf0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78   res = sqlite3Ex
10c00 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e  prIsConstant(pIn
10c10 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  );.  pIn->pLeft 
10c20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e  = pLHS;.  return
10c30 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   res;.}.#endif..
10c40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10c50 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
10c60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
10c70 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
10c80 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54  ) operator..** T
10c90 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20  he pX parameter 
10ca0 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  is the expressio
10cb0 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  n on the RHS of 
10cc0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
10cd0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
10ce0 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74  be either a list
10cf0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
10d00 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a  or a subquery..*
10d10 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
10d20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10d30 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
10d40 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  e a b-tree objec
10d50 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  t that can.** be
10d60 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20   used either to 
10d70 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
10d80 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73  hip in the RHS s
10d90 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
10da0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
10db0 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52  members of the R
10dc0 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67  HS set, skipping
10dd0 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
10de0 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f  ** A cursor is o
10df0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
10e00 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
10e10 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  is the RHS of th
10e20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
10e30 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20   and pX->iTable 
10e40 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
10e50 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73  dex of that curs
10e60 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  or..**.** The re
10e70 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
10e80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
10e90 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
10ea0 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
10eb0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
10ec0 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20  INDEX_ROWID     
10ed0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
10ee0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
10ef0 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
10f00 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
10f10 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72  X_ASC  - The cur
10f20 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
10f30 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
10f40 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
10f50 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d  DEX_INDEX_DESC -
10f60 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
10f70 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63  opened on a desc
10f80 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
10f90 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
10fa0 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72         - The cur
10fb0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
10fc0 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
10fd0 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
11000 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
11010 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  **   IN_INDEX_NO
11020 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75  OP       - No cu
11030 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74  rsor was allocat
11040 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  ed.  The IN oper
11050 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  ator must be.** 
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e          implemen
11080 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63  ted as a sequenc
11090 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
110a0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
110b0 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74  ing b-tree might
110c0 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
110d0 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70  RHS expression p
110e0 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  X is a simple.**
110f0 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61   subquery such a
11100 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
11110 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c  ECT <column1>, <
11120 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d  column2>... FROM
11130 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
11140 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11150 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11160 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
11170 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
11180 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
11190 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
111a0 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
111b0 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
111c0 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
111d0 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
111e0 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
111f0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
11200 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
11210 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
11220 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46  e..**.** The inF
11230 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d  lags parameter m
11240 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63  ust contain exac
11250 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  tly one of the b
11260 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
11270 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
11280 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66  _INDEX_LOOP.  If
11290 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e   inFlags contain
112a0 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
112b0 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74  MBERSHIP, then t
112c0 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
112d0 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
112e0 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65  for a.** fast me
112f0 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20  mbership test.  
11300 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45  When the IN_INDE
11310 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65  X_LOOP bit is se
11320 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64  t, the.** IN ind
11330 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ex will be used 
11340 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  to loop over all
11350 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52   values of the R
11360 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20  HS of the.** IN 
11370 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
11380 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
11390 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
113a0 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
113b0 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
113c0 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
113d0 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
113e0 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
113f0 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
11400 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
11410 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
11420 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
11430 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
11440 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67  ed columns are g
11450 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
11460 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
11470 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
11480 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
11490 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74  ARY KEY or due t
114a0 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f  o.** a UNIQUE co
114b0 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65  nstraint or inde
114c0 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  x..**.** When IN
114d0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
114e0 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
114f0 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
11500 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
11510 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
11520 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61  ip tests) then a
11530 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
11540 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
11550 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
11560 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ns> is a single 
11570 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11580 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e  KEY column or an
11590 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62   .** index can b
115a0 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65  e found with the
115b0 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75   specified <colu
115c0 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74  mns> as its left
115d0 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -most..**.** If 
115e0 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
115f0 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
11600 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
11610 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
11620 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
11630 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
11640 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
11650 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
11660 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
11670 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
11680 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
11690 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
116a0 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
116b0 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
116c0 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
116d0 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
116e0 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
116f0 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
11700 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
11710 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
11720 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
11730 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
11740 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
11750 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
11760 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
11770 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
11780 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
11790 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
117a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
117b0 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
117c0 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
117d0 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
117e0 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
117f0 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
11800 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
11810 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
11820 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
11830 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
11840 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
11850 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
11860 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
11870 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
11880 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
11890 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
118a0 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
118b0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
118c0 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
118d0 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
118e0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
118f0 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
11900 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
11910 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
11920 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
11930 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
11940 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
11950 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
11960 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
11970 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
11980 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
11990 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
119a0 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
119b0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
119c0 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
119d0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
119e0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
119f0 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
11a00 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
11a10 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
11a20 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
11a30 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
11a40 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72  If the aiMap par
11a50 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ameter is not NU
11a60 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e  LL, it must poin
11a70 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f  t to an array co
11a80 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20  ntaining.** one 
11a90 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68  element for each
11aa0 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
11ab0 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
11ac0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20  tatement on the 
11ad0 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e  RHS.** of the IN
11ae0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20  (...) operator. 
11af0 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f  The i'th entry o
11b00 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70  f the array is p
11b10 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
11b20 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74  e.** offset of t
11b30 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
11b40 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
11b50 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74   i'th column ret
11b60 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  urned by the.** 
11b70 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d  SELECT. For exam
11b80 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72  ple, if the expr
11b90 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63  ession and selec
11ba0 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a  ted index are:.*
11bb0 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49  *.**   (?,?,?) I
11bc0 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20  N (SELECT a, b, 
11bd0 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20  c FROM t1).**   
11be0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
11bf0 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a  ON t1(b, c, a);.
11c00 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70  **.** then aiMap
11c10 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  [] is populated 
11c20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a  with {2, 0, 1}..
11c30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11c40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11c50 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
11c60 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  nIndex(.  Parse 
11c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11c80 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11c90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
11ca0 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20  r *pX,          
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
11cc0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
11cd0 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f  RHS) of the IN o
11ce0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32  perator */.  u32
11cf0 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20   inFlags,       
11d00 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e          /* IN_IN
11d10 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45  DEX_LOOP, _MEMBE
11d20 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e  RSHIP, and/or _N
11d30 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20  OOP_OK */.  int 
11d40 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20  *prRhsHasNull,  
11d50 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
11d60 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20  er holding NULL 
11d70 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74  status.  See not
11d80 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d  es */.  int *aiM
11d90 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
11da0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
11db0 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20  om Index fields 
11dc0 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f  to RHS fields */
11dd0 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  .){.  Select *p;
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11e00 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
11e10 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
11e20 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
11e30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e50 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
11e60 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
11e70 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
11e80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
11e90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
11ea0 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
11eb0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
11ec0 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ee0 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
11ef0 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
11f00 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
11f10 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11f20 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
11f30 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
11f40 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
11f50 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
11f60 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
11f70 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
11f80 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
11f90 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  !=0;..  /* If th
11fa0 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e  e RHS of this IN
11fb0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69  (...) operator i
11fc0 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20  s a SELECT, and 
11fd0 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20  if it matters . 
11fe0 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11ff0 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ot the SELECT re
12000 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  sult contains NU
12010 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b  LL values, check
12020 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72   whether.  ** or
12030 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74   not NULL is act
12040 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28  ually possible (
12050 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66  it may not be, f
12060 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20  or example, due 
12070 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c  .  ** to NOT NUL
12080 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  L constraints in
12090 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66   the schema). If
120a0 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20   no NULL values 
120b0 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20  are possible,.  
120c0 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e  ** set prRhsHasN
120d0 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20  ull to 0 before 
120e0 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a  continuing.  */.
120f0 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
12100 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73  ll && (pX->flags
12110 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
12120 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12130 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
12140 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c  ist = pX->x.pSel
12150 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
12160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12170 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12180 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12190 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
121a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
121b0 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pr) ) break;.   
121c0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45   }.    if( i==pE
121d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
121e0 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c       prRhsHasNul
121f0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
12200 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
12210 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
12220 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
12230 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
12240 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
12250 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
12260 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
12270 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
12280 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
12290 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66   table.  */.  if
122a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
122b0 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64  0 && (p = isCand
122c0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58  idateForInOpt(pX
122d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
122e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
122f0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
12300 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12310 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
12320 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
12350 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
12360 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12390 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
123a0 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  b */.    ExprLis
123b0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
123c0 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e  EList;.    int n
123d0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
123e0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
123f0 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
12400 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
12410 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
12420 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
12430 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
12440 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
12450 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
12460 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
12470 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
12480 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
12490 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124b0 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
124c0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
124d0 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
124e0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
124f0 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
12500 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
12510 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
12520 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
12530 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
12540 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
12550 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
12560 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
12570 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
12580 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
12590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
125a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
125b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
125c0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
125d0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  ;..    assert(v)
125e0 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ;  /* sqlite3Get
125f0 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79  Vdbe() has alway
12600 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
12610 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  y called */.    
12620 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
12630 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
12640 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
12650 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  .      /* The "x
12660 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69   IN (SELECT rowi
12670 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63  d FROM table)" c
12680 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ase */.      int
12690 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
126a0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
126b0 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64  _Once);.      Vd
126c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
126d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
126e0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
126f0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
12700 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
12710 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
12720 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
12730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12740 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
12750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12760 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
12790 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
127a0 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
127b0 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20  ty_ok = 1;.     
127c0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f   int i;..      /
127d0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
127e0 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
127f0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
12800 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20  erform each .   
12810 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
12820 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
12830 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
12840 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
12850 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  able.      ** on
12860 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
12870 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  IN operator.  If
12880 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   it not, it is n
12890 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20  ot possible to. 
128a0 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20       ** use any 
128b0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53  index of the RHS
128c0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
128d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
128e0 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  pr && affinity_o
128f0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
12900 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
12910 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
12920 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
12930 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
12940 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74  nt iCol = pEList
12950 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[i].pExpr->iC
12960 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63  olumn;.        c
12970 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c  har idxaff = sql
12980 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41  ite3TableColumnA
12990 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f  ffinity(pTab,iCo
129a0 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65  l); /* RHS table
129b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
129c0 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65   cmpaff = sqlite
129d0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
129e0 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a  (pLhs, idxaff);.
129f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12a00 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
12a10 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
12a20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63       testcase( c
12a30 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  mpaff==SQLITE_AF
12a40 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
12a50 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66    switch( cmpaff
12a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
12a70 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
12a80 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB:.            
12a90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12aa0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
12ab0 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20  _TEXT:.         
12ac0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d     /* sqlite3Com
12ad0 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f  pareAffinity() o
12ae0 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54  nly returns TEXT
12af0 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   if one side or 
12b00 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
12b10 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20  ** other has no 
12b20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65  affinity and the
12b30 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54   other side is T
12b40 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20  EXT.  Hence,.   
12b50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
12b60 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70  only way for cmp
12b70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69  aff to be TEXT i
12b80 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20  s for idxaff to 
12b90 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20  be TEXT.        
12ba0 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74      ** and for t
12bb0 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c  he term on the L
12bc0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20  HS of the IN to 
12bd0 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79  have no affinity
12be0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
12bf0 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d   assert( idxaff=
12c00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
12c10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
12c20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12c30 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
12c40 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f        affinity_o
12c50 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  k = sqlite3IsNum
12c60 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
12c70 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aff);.        }.
12c80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
12c90 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
12ca0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  {.        /* Sea
12cb0 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
12cc0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
12cd0 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69  ill work for thi
12ce0 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
12cf0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
12d00 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
12d10 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
12d20 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
12d30 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42  xt){.          B
12d40 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20  itmask colUsed; 
12d50 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
12d60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  of the index use
12d70 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42  d */.          B
12d80 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20  itmask mCol;    
12d90 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72       /* Mask for
12da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
12db0 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  umn */.         
12dc0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
12dd0 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69  mn<nExpr ) conti
12de0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  nue;.          /
12df0 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d  * Maximum nColum
12e00 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20  n is BMS-2, not 
12e10 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77  BMS-1, so that w
12e20 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20  e can compute.  
12e30 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41          ** BITMA
12e40 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75  SK(nExpr) withou
12e50 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f  t overflowing */
12e60 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
12e70 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ase( pIdx->nColu
12e80 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20  mn==BMS-2 );.   
12e90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12ea0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
12eb0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  BMS-1 );.       
12ec0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
12ed0 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f  lumn>=BMS-1 ) co
12ee0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12ef0 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71    if( mustBeUniq
12f00 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ue ){.          
12f10 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79    if( pIdx->nKey
12f20 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  Col>nExpr.      
12f30 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e         ||(pIdx->
12f40 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26  nColumn>nExpr &&
12f50 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
12f60 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20  pIdx)).         
12f70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
12f80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
12f90 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
12fa0 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20  not unique over 
12fb0 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d  the IN RHS colum
12fc0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ns */.          
12fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
12fe0 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c    .          col
12ff0 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43  Used = 0;   /* C
13000 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20  olumns of index 
13010 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  used so far */. 
13020 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
13030 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
13050 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
13060 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
13070 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
13080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  );.            E
13090 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
130a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
130b0 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
130c0 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
130d0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
130e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
130f0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
13100 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
13110 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61    .            a
13120 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c  ssert( pReq!=0 |
13130 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d  | pRhs->iColumn=
13140 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61  =XN_ROWID || pPa
13150 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20  rse->nErr );.   
13160 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
13170 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  ; j<nExpr; j++){
13180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13190 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
131a0 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c  n[j]!=pRhs->iCol
131b0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
131d0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f  sert( pIdx->azCo
131e0 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20  ll[j] );.       
131f0 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21         if( pReq!
13200 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
13210 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65  ICmp(pReq->zName
13220 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
13230 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
13240 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
13250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
13260 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
13270 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13290 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
132a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
132b0 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42      mCol = MASKB
132c0 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  IT(j);.         
132d0 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f     if( mCol & co
132e0 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f  lUsed ) break; /
132f0 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73  * Each column us
13300 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ed only once */.
13310 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
13320 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20  sed |= mCol;.   
13330 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d           if( aiM
13340 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  ap ) aiMap[i] = 
13350 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  j;.          }. 
13360 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65   .          asse
13370 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20  rt( i==nExpr || 
13380 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49  colUsed!=(MASKBI
13390 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20  T(nExpr)-1) );. 
133a0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c           if( col
133b0 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e  Used==(MASKBIT(n
133c0 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  Expr)-1) ){.    
133d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
133e0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
133f0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
13400 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  e index pIdx is 
13410 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  usable */.      
13420 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
13430 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13440 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
13450 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13460 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13470 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
13480 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13490 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
134a0 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30 2c  P_Explain, 0, 0,
134b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
134c0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
134d0 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44 45  (db, "USING INDE
134e0 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
134f0 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
13500 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
13510 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 23    P4_DYNAMIC);.#
13520 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
13530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13540 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
13550 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e  ad, iTab, pIdx->
13560 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
13570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13580 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
13590 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
135a0 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
135b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
135c0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
135d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
135e0 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  rt( IN_INDEX_IND
135f0 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e  EX_DESC == IN_IN
13600 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20  DEX_INDEX_ASC+1 
13610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
13620 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13630 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78  INDEX_ASC + pIdx
13640 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b  ->aSortOrder[0];
13650 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
13660 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
13670 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
13680 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
13690 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
136a0 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b          i64 mask
136b0 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b   = (1<<nExpr)-1;
136c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
136d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
136e0 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
136f0 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20  nsUsed, .       
13700 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c             iTab,
13710 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73   0, 0, (u8*)&mas
13720 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65  k, P4_INT64);.#e
13730 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
13740 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
13750 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13760 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
13770 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b   if( nExpr==1 ){
13780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13790 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
137a0 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20  llFlag(v, iTab, 
137b0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  *prRhsHasNull);.
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
137d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
137e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
137f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13800 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
13810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f     }.        } /
13820 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * End loop over 
13830 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20  indexes */.     
13840 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66   } /* End if( af
13850 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20  finity_ok ) */. 
13860 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e     } /* End if n
13870 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65  ot an rowid inde
13880 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20  x */.  } /* End 
13890 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d  attempt to optim
138a0 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  ize using an ind
138b0 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e  ex */..  /* If n
138c0 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e  o preexisting in
138d0 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
138e0 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75   for the IN clau
138f0 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49  se.  ** and IN_I
13900 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20  NDEX_NOOP is an 
13910 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20  allowed reply.  
13920 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f  ** and the RHS o
13930 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13940 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74  r is a list, not
13950 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a   a subquery.  **
13960 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20   and the RHS is 
13970 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20  not constant or 
13980 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
13990 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
139a0 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
139b0 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
139c0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
139d0 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74   evaluate.  ** t
139e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
139f0 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  o return IN_INDE
13a00 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69  X_NOOP..  */.  i
13a10 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26  f( eType==0.   &
13a20 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  & (inFlags & IN_
13a30 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20  INDEX_NOOP_OK). 
13a40 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
13a50 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
13a60 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21  Select).   && (!
13a70 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
13a80 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58  nstant(pX) || pX
13a90 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
13aa0 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54  <=2).  ){.    eT
13ab0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e  ype = IN_INDEX_N
13ac0 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
13ad0 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
13ae0 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  /* Could not fin
13af0 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
13b00 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
13b10 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
13b20 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
13b30 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
13b40 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
13b50 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
13b60 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
13b70 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75      u32 savedNQu
13b80 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
13b90 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
13ba0 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
13bb0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70  ll = 0;.    eTyp
13bc0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
13bd0 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67  ;.    if( inFlag
13be0 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
13bf0 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  P ){.      pPars
13c00 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
13c10 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
13c20 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
13c30 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
13c40 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
13c50 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
13c60 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
13c70 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
13c80 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13c90 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
13ca0 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
13cb0 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
13cc0 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
13cd0 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
13ce0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
13cf0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
13d00 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
13d10 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
13d20 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
13d30 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
13d40 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
13d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
13d60 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
13d70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
13d80 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
13d90 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
13da0 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
13db0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
13dc0 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
13dd0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
13de0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
13df0 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
13e00 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
13e10 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
13e20 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
13e30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
13e40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13e50 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72  UBQUERY./*.** Ar
13e60 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20  gument pExpr is 
13e70 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28  an (?, ?...) IN(
13e80 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
13e90 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
13ea0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
13eb0 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74   returns a nul-t
13ec0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
13ed0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20   containing .** 
13ee0 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74  the affinities t
13ef0 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61  o be used for ea
13f00 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
13f10 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
13f20 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
13f30 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
13f40 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
13f50 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74  ure that the ret
13f60 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  urned.** string 
13f70 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
13f80 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
13f90 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  3DbFree()..*/.st
13fa0 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49  atic char *exprI
13fb0 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  NAffinity(Parse 
13fc0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13fd0 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  Expr){.  Expr *p
13fe0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
13ff0 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20  eft;.  int nVal 
14000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
14010 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
14020 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
14030 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  t = (pExpr->flag
14040 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
14050 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ) ? pExpr->x.pSe
14060 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72  lect : 0;.  char
14070 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72   *zRet;..  asser
14080 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
14090 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20  _IN );.  zRet = 
140a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
140b0 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  aw(pParse->db, n
140c0 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52  Val+1);.  if( zR
140d0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
140e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
140f0 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
14100 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c    Expr *pA = sql
14110 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
14120 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
14130 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20 3d  ;.      char a =
14140 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
14150 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20  nity(pA);.      
14160 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
14170 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
14180 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14190 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d  ffinity(pSelect-
141a0 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
141b0 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d  xpr, a);.      }
141c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52  else{.        zR
141d0 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20  et[i] = a;.     
141e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65   }.    }.    zRe
141f0 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a  t[nVal] = '\0';.
14200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
14210 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  t;.}.#endif..#if
14220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14230 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
14240 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20 6f  Load the Parse o
14250 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
14260 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
14270 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  nt with an error
14280 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20   .** message of 
14290 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
142a0 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
142b0 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
142c0 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f  - expected M".*/
142d0 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
142e0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50  SubselectError(P
142f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14300 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e  t nActual, int n
14310 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74  Expect){.  const
14320 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73   char *zFmt = "s
14330 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
14340 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  s %d columns - e
14350 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73  xpected %d";.  s
14360 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14370 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63  Parse, zFmt, nAc
14380 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a  tual, nExpect);.
14390 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
143a0 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  Expression pExpr
143b0 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68 61   is a vector tha
143c0 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
143d0 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65  in a context whe
143e0 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  re.** it is not 
143f0 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45  permitted. If pE
14400 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c  xpr is a sub-sel
14410 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73  ect vector, this
14420 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61   routine .** loa
14430 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ds the Parse obj
14440 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73 61  ect with a messa
14450 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
14460 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
14470 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
14480 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
14490 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66   1".**.** Or, if
144a0 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61 72   it is a regular
144b0 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a   scalar vector:.
144c0 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c  **.**   "row val
144d0 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20  ue misused".*/  
144e0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65   .void sqlite3Ve
144f0 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72  ctorErrorMsg(Par
14500 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
14510 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65   *pExpr){.#ifnde
14520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
14530 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78  BQUERY.  if( pEx
14540 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
14550 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  IsSelect ){.    
14560 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
14570 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45  Error(pParse, pE
14580 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
14590 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31  pEList->nExpr, 1
145a0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
145b0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
145c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
145d0 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
145e0 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  used");.  }.}../
145f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14600 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
14610 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
14620 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
14630 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a  ession, EXISTS,.
14640 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ** or IN operato
14650 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
14660 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
14670 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
14680 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
14690 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
146a0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
146b0 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
146c0 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
146d0 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
146e0 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
146f0 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
14700 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
14710 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
14720 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
14730 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
14740 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
14750 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
14760 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
14770 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
14780 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
14790 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
147a0 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
147b0 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
147c0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
147d0 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
147e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70  n-zero, then exp
147f0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
14800 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
14810 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
14820 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c   "<rowid> IN (?,
14830 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c   ?, ?)", where <
14840 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65  rowid> is a refe
14850 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65  rence.** to some
14860 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c   integer key col
14870 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42  umn of a table B
14880 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
14890 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69  ase, use an.** i
148a0 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20  ntkey B-Tree to 
148b0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
148c0 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20   IN(...) values 
148d0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
148e0 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29  sual.** (slower)
148f0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
14900 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a   keys B-Tree..**
14910 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e  .** If rMayHaveN
14920 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ull is non-zero,
14930 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
14940 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
14950 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20  s an IN.** (not 
14960 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
14970 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65  TS) and that the
14980 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61   RHS might conta
14990 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c  ins NULLs..** Al
149a0 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
149b0 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
149c0 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  e the register g
149d0 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
149e0 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e  Null.** to NULL.
149f0 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
14a00 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  es will take car
14a10 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
14a20 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76  is register.** v
14a30 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
14a40 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
14a50 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
14a60 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
14a70 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
14a80 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
14a90 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
14aa0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
14ab0 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75  For a multi-colu
14ac0 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72  mn SELECT, the r
14ad0 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
14ae0 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a  in a contiguous.
14af0 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  ** array of regi
14b00 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72 65  sters and the re
14b10 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
14b20 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  e register of th
14b30 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72  e left-most.** r
14b40 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52  esult column.  R
14b50 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f  eturn 0 for IN o
14b60 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61  perators or if a
14b70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
14b80 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14b90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
14ba0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
14bb0 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
14bc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14bd0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14be0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
14bf0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
14c00 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
14c10 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
14c20 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
14c30 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c  nt rHasNullFlag,
14c40 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
14c50 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
14c60 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
14c70 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
14c80 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
14c90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
14ca0 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
14cb0 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
14cc0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d  d */.){.  int jm
14cd0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
14d00 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
14d10 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
14d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14d40 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20  egister storing 
14d50 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56  resulting */.  V
14d60 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
14d70 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14d80 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
14d90 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
14da0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14db0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a  ePush(pParse);..
14dc0 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74    /* The evaluat
14dd0 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58  ion of the IN/EX
14de0 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74  ISTS/SELECT must
14df0 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65   be repeated eve
14e00 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20  ry time it.  ** 
14e10 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
14e20 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
14e30 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
14e40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
14e50 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
14e60 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
14e70 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
14e80 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
14e90 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
14ea0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
14eb0 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
14ec0 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
14ed0 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
14ee0 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
14ef0 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
14f00 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
14f10 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
14f20 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
14f30 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
14f40 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
14f50 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
14f60 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
14f70 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
14f80 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
14f90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14fa0 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
14fb0 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66  ct) ){.    jmpIf
14fc0 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65  Dynamic = sqlite
14fd0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14fe0 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
14ff0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23  erage(v);.  }..#
15000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15010 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
15020 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
15030 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
15040 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
15050 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
15060 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
15070 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
15080 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
15090 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
150a0 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
150b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
150c0 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
150d0 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ",.        pPars
150e0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
150f0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
15100 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15110 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
15120 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
15130 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
15140 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
15150 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
15160 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
15170 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
15180 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
151b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
151c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
151d0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
151e0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
151f0 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
15200 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
15210 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
15220 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
15230 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
15240 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
15250 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20  nt nVal;        
15260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
15270 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65  ze of vector pLe
15280 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20  ft */.      .   
15290 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
152a0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
152b0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
152c0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c  sert( !isRowid |
152d0 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20  | nVal==1 );..  
152e0 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
152f0 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
15300 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
15310 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
15320 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
15330 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
15340 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
15350 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
15360 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
15370 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
15380 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  h index keys rep
15390 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
153a0 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a  sults from the .
153b0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
153c0 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
153d0 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
153e0 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
153f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
15400 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
15410 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
15420 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
15430 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
15440 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
15450 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
15460 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
15470 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
15480 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
15490 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
154a0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
154b0 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
154c0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
154d0 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
154e0 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
154f0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
15500 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
15510 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
15520 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
15530 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
15540 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
15550 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
15560 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
15570 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
15580 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
15590 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
155a0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
155b0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
155c0 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
155d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155e0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
155f0 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20  emeral, .       
15600 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
15610 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61  , (isRowid?0:nVa
15620 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  l));.      pKeyI
15630 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
15640 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
15650 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
15660 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20  db, nVal, 1);.. 
15670 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
15680 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15690 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
156a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
156b0 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
156c0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
156d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
156e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
156f0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
15700 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
15710 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
15720 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
15730 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
15740 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
15750 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
15760 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
15770 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
15780 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
15790 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
157a0 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
157b0 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
157c0 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
157d0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   );.        /* I
157e0 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48  f the LHS and RH
157f0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
15800 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ator do not matc
15810 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  h, that.        
15820 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61  ** error will ha
15830 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c  ve been caught l
15840 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65  ong before we re
15850 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ach this point. 
15860 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  */.        if( A
15870 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
15880 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
15890 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
158a0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
158b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
158c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
158d0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
158e0 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
158f0 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
15900 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
15910 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
15920 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
15930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  );.          pSe
15940 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
15950 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
15960 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73  case( pSelect->s
15970 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
15980 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
15990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
159a0 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
159b0 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
159c0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
159d0 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
159e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
159f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
15a00 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
15a10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15a20 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
15a30 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
15a40 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
15a50 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
15a60 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
15a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
15a80 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
15a90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
15aa0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
15ab0 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
15ac0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
15ad0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
15ae0 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
15af0 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
15b00 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
15b10 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
15b20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15b30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
15b40 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
15b50 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
15b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
15b70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
15b80 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
15b90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ) );.          f
15ba0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
15bb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15bc0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
15bd0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
15be0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
15bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65  .            pKe
15c00 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
15c10 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
15c20 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15c40 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
15c50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20  ->a[i].pExpr.   
15c60 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
15c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15c80 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
15c90 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
15ca0 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
15cb0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
15cc0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
15cd0 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
15ce0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
15cf0 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
15d00 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
15d10 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
15d20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
15d30 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
15d40 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
15d50 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
15d60 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
15d70 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
15d80 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
15d90 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
15da0 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
15db0 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
15dc0 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
15dd0 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
15de0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
15df0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
15e00 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
15e10 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ty;            /
15e20 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
15e30 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
15e40 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
15e50 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
15e60 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
15e70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
15e80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
15e90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
15ea0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
15eb0 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20   r2, r3;..      
15ec0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
15ed0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
15ee0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  (pLeft);.       
15ef0 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
15f00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
15f10 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
15f20 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
15f30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
15f40 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
15f50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15f60 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
15f70 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
15f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
15f90 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
15fa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
15fb0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
15fc0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
15fd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
15fe0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
15ff0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
16000 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
16010 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
16020 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16030 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
16040 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
16050 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16060 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
16070 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
16080 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16090 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
160a0 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
160b0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
160c0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
160d0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
160e0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
160f0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
16100 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
16110 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
16120 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
16130 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
16140 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
16150 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
16160 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
16170 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
16180 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
16190 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
161a0 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
161b0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
161c0 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
161d0 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
161e0 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
161f0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
16200 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
16210 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
16220 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
16230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16240 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
16250 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
16260 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
16270 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
16280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16290 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
162a0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
162b0 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
162c0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
162d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
162e0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
162f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
16300 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
16310 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
16320 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
16330 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
16340 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
16350 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
16360 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
16370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16380 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16390 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
163a0 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
163b0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
163c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
163d0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
163e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
163f0 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
16400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
16410 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
16420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
16440 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
16470 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16480 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
16490 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
164a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
164b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
164c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
164d0 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
164e0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
164f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
16500 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
16510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16520 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
16530 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
16540 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
16560 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16570 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
16580 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
16590 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
165a0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
165b0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
165c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
165d0 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
165e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16610 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16620 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
16630 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16640 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16650 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
16660 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
16670 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16680 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
16690 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
166a0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
166b0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
166c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
166d0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
166e0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
166f0 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
16700 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
16710 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28   /* Case 3:    (
16720 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
16730 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ...).      **   
16740 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28    or:    EXISTS(
16750 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
16760 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ...).      **.  
16770 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c      ** For a SEL
16780 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
16790 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76 61  de to put the va
167a0 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  lues for all col
167b0 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a  umns of.      **
167c0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
167d0 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
167e0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
167f0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
16800 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
16810 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
16820 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16830 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
16840 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20  XISTS, write an 
16850 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
16860 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
16870 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sts).      ** in
16880 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
16890 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
168a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
168b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
168c0 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
168d0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
168e0 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
168f0 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20  IT 1".  Any .   
16900 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
16910 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61  g limit is disca
16920 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  rded in place of
16930 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31   the new LIMIT 1
16940 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16950 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
16980 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
16990 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
169a0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
169d0 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
169e0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
169f0 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16a20 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
16a30 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
16a40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
16a50 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
16a60 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
16a70 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
16a80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16a90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
16aa0 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
16ab0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
16ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
16ad0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16ae0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16af0 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
16b00 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
16b10 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67  lect;.      nReg
16b20 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
16b30 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
16b40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
16b50 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
16b60 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
16b70 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
16b80 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
16b90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
16ba0 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
16bb0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
16bc0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
16bd0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16be0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
16bf0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
16c00 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
16c10 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
16c20 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
16c30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16c40 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
16c50 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
16c60 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
16c70 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
16c80 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
16c90 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
16ca0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16cb0 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
16cc0 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
16cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16ce0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16cf0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
16d00 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
16d10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16d20 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
16d30 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
16d40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16d50 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
16d60 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
16d70 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
16d80 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
16d90 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
16da0 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45  rse->db, TK_INTE
16db0 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
16de0 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
16df0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
16e00 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
16e10 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sel->selFlags &=
16e20 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b   ~SF_MultiValue;
16e30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
16e40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16e50 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
16e60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16e70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16e80 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
16e90 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
16ea0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
16eb0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
16ec0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16ee0 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
16ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
16f00 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
16f10 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
16f20 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
16f30 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
16f40 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
16f50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16f60 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
16f70 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
16f80 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16f90 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
16fa0 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
16fb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16fc0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
16fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16fe0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
16ff0 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49  Expr pIn is an I
17000 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
17010 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
17020 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
17030 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
17040 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
17050 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20  e IN() operator 
17060 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
17070 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d  ber of .** colum
17080 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72  ns as the vector
17090 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c   on the LHS. Or,
170a0 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
170b0 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a  he IN() is not .
170c0 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20  ** a sub-query, 
170d0 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20  that the LHS is 
170e0 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65  a vector of size
170f0 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
17100 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61  e3ExprCheckIN(Pa
17110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
17120 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  r *pIn){.  int n
17130 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
17140 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
17150 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  In->pLeft);.  if
17160 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20  ( (pIn->flags & 
17170 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17180 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
17190 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
171a0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
171b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
171c0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
171d0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
171e0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
171f0 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
17200 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
17210 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
17220 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
17230 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f      sqlite3Vecto
17240 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  rErrorMsg(pParse
17250 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  , pIn->pLeft);. 
17260 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
17270 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
17280 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
17290 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
172a0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
172b0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49  te code for an I
172c0 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  N expression..**
172d0 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53  .**      x IN (S
172e0 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20  ELECT ...).**   
172f0 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20     x IN (value, 
17300 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  value, ...).**.*
17310 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  * The left-hand 
17320 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20  side (LHS) is a 
17330 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72  scalar or vector
17340 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
17350 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
17360 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61   side (RHS) is a
17370 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
17380 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76  or more scalar v
17390 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73  alues, or a.** s
173a0 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  ubquery.  If the
173b0 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65   RHS is a subque
173c0 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ry, the number o
173d0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
173e0 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74   must.** match t
173f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
17400 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  umns in the vect
17410 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20  or on the LHS.  
17420 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a  If the RHS is.**
17430 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
17440 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20  s, the LHS must 
17450 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a  be a scalar. .**
17460 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61  .** The IN opera
17470 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74  tor is true if t
17480 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20  he LHS value is 
17490 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
174a0 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65   the RHS..** The
174b0 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65   result is false
174c0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64   if the LHS is d
174d0 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e  efinitely not in
174e0 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a   the RHS.  The .
174f0 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  ** result is NUL
17500 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63  L if the presenc
17510 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
17520 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62  the RHS cannot b
17530 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  e .** determined
17540 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a   due to NULLs..*
17550 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17560 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
17570 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64   that jumps to d
17580 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
17590 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
175a0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
175b0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
175c0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
175d0 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
175e0 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
175f0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
17600 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
17610 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
17620 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
17630 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
17640 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
17650 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a  all through..**.
17660 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72  ** See the separ
17670 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  ate in-operator.
17680 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  md documentation
17690 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e   file in the can
176a0 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65  onical.** SQLite
176b0 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72   source tree for
176c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
176d0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
176e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
176f0 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
17700 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17710 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
17720 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
17730 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
17740 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
17750 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
17760 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
17770 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
17780 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
17790 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
177a0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
177b0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
177c0 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
177d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
177e0 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
177f0 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
17800 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
17810 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
17820 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
17830 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
17840 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
17850 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
17860 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
17870 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
17880 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
17890 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lhs;            
178a0 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20   /* Register(s) 
178b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20  holding the LHS 
178c0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
178d0 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20  rLhsOrig;       
178e0 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20    /* LHS values 
178f0 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72  prior to reorder
17900 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a  ing by aiMap[] *
17910 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
17920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
17930 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
17940 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
17950 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20  nt *aiMap = 0;  
17960 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d       /* Map from
17970 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f   vector field to
17980 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f   index column */
17990 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20  .  char *zAff = 
179a0 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69  0;       /* Affi
179b0 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20  nity string for 
179c0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20  comparisons */. 
179d0 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20   int nVector;   
179e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
179f0 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68  f vectors for th
17a00 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
17a10 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20  /.  int iDummy; 
17a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d            /* Dum
17a30 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  my parameter to 
17a40 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29  exprCodeVector()
17a50 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
17a60 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
17a70 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
17a80 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
17a90 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17aa0 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75       /* loop cou
17ab0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65  nter */.  int de
17ac0 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20  stStep2;        
17ad0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
17ae0 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e   when NULLs seen
17af0 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20   in step 2 */.  
17b00 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20  int destStep6 = 
17b10 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  0;    /* Start o
17b20 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20  f code for Step 
17b30 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
17b40 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20  ruthOp;      /* 
17b50 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64  Address of opcod
17b60 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  e that determine
17b70 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65  s the IN is true
17b80 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f   */.  int destNo
17b90 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a  tNull;      /* J
17ba0 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f  ump here if a co
17bb0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
17bc0 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a  true in step 6 *
17bd0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
17be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
17bf0 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c   of the step-6 l
17c00 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74  oop */ ..  pLeft
17c10 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
17c20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
17c30 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65  prCheckIN(pParse
17c40 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72  , pExpr) ) retur
17c50 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72  n;.  zAff = expr
17c60 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
17c70 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65  e, pExpr);.  nVe
17c80 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
17c90 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
17ca0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69  pr->pLeft);.  ai
17cb0 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Map = (int*)sqli
17cc0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
17cd0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
17ce0 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65  b, nVector*(size
17cf0 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
17d00 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b  (char)) + 1.  );
17d10 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
17d20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17d30 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78  ) goto sqlite3Ex
17d40 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
17d50 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  or;..  /* Attemp
17d60 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
17d70 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
17d80 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
17d90 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
17da0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
17db0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
17dc0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
17dd0 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
17de0 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
17df0 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
17e00 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
17e10 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
17e20 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
17e30 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
17e40 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
17e50 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
17e60 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
17e70 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
17e80 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
17e90 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
17ea0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
17eb0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
17ec0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
17ed0 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
17ee0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
17ef0 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
17f00 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
17f30 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
17f40 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
17f70 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
17f80 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
17f90 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
17fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
17fb0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
17fc0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
17fd0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
17fe0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
17ff0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
18000 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
18010 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
18020 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
18030 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f  TE_DEBUG.  /* Co
18040 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70  nfirm that aiMap
18050 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63  [] contains nVec
18060 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75  tor integer valu
18070 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
18080 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e  .  ** nVector-1.
18090 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
180a0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
180b0 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a      int j, cnt;.
180c0 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b      for(cnt=j=0;
180d0 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29   j<nVector; j++)
180e0 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69   if( aiMap[j]==i
180f0 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73   ) cnt++;.    as
18100 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a  sert( cnt==1 );.
18110 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18120 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
18130 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
18140 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
18150 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  . If the LHS is 
18160 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20  a .  ** vector, 
18170 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65  then it is store
18180 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  d in an array of
18190 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65   nVector registe
181a0 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a  rs starting .  *
181b0 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20  * at r1..  **.  
181c0 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  ** sqlite3FindIn
181d0 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61  Index() might ha
181e0 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65  ve reordered the
181f0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c   fields of the L
18200 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73  HS vector.  ** s
18210 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64  o that the field
18220 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d  s are in the sam
18230 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78  e order as an ex
18240 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20  isting index.   
18250 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d  The.  ** aiMap[]
18260 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
18270 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  a mapping from t
18280 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20  he original LHS 
18290 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20  field order to. 
182a0 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72   ** the field or
182b0 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73  der that matches
182c0 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a   the RHS index..
182d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
182e0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
182f0 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20  se);.  rLhsOrig 
18300 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  = exprCodeVector
18310 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
18320 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28  &iDummy);.  for(
18330 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26  i=0; i<nVector &
18340 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69  & aiMap[i]==i; i
18350 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53  ++){} /* Are LHS
18360 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65   fields reordere
18370 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e  d? */.  if( i==n
18380 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a  Vector ){.    /*
18390 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20   LHS fields are 
183a0 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f  not reordered */
183b0 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73  .    rLhs = rLhs
183c0 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Orig;.  }else{. 
183d0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
183e0 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69  order the LHS fi
183f0 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74  elds according t
18400 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72  o aiMap */.    r
18410 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Lhs = sqlite3Get
18420 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
18430 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
18440 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
18450 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
18460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18470 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c  3(v, OP_Copy, rL
18480 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61  hsOrig+i, rLhs+a
18490 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  iMap[i], 0);.   
184a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
184b0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
184c0 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
184d0 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
184e0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
184f0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
18500 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
18510 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
18520 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
18530 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
18540 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
18550 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
18560 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65   step (1) in the
18570 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
18580 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69  optimized algori
18590 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  thm..  */.  if( 
185a0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
185b0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
185c0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
185d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
185e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
185f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18600 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
18610 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
18620 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
18630 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18640 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
18650 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
18660 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
18670 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
18680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
18690 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
186a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
186b0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
186c0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
186d0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
186e0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
186f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18700 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
18710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18720 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68  , OP_BitAnd, rLh
18730 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75  s, rLhs, regCkNu
18740 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ll);.    }.    f
18750 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73  or(ii=0; ii<pLis
18760 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  t->nExpr; ii++){
18770 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
18780 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18790 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
187a0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67  [ii].pExpr, &reg
187b0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69  ToFree);.      i
187c0 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20  f( regCkNull && 
187d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
187e0 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69  Null(pList->a[ii
187f0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
18800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18810 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
18820 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72  nd, regCkNull, r
18830 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  2, regCkNull);. 
18840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18850 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
18860 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c  -1 || destIfNull
18870 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
18880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18890 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
188a0 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c  _Eq, rLhs, label
188b0 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  Ok, r2,.        
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
188e0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
188f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18900 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d  eIf(v, ii<pList-
18910 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
18920 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
18930 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e  f(v, ii==pList->
18940 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
18950 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18960 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
18970 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18990 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
189a0 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20  IfFalse );.     
189b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
189c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
189d0 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Lhs, destIfFalse
189e0 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
18a10 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43  _COLLSEQ); VdbeC
18a20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18a40 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
18a50 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  0] | SQLITE_JUMP
18a60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
18a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
18a80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18a90 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
18aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18ab0 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
18ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ad0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
18ae0 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
18af0 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
18b00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18b10 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
18b20 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
18b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
18b40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18b50 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b  bel(v, labelOk);
18b60 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
18b70 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18b80 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  e, regCkNull);. 
18b90 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
18ba0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
18bb0 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  ed;.  }..  /* St
18bc0 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73  ep 2: Check to s
18bd0 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f  ee if the LHS co
18be0 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
18bf0 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65  columns.  If the
18c00 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63  .  ** LHS does c
18c10 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65  ontain NULLs the
18c20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
18c30 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53  t be either FALS
18c40 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20  E or NULL..  ** 
18c50 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69  We will then ski
18c60 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  p the binary sea
18c70 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a  rch of the RHS..
18c80 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
18c90 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
18ca0 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74  se ){.    destSt
18cb0 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ep2 = destIfFals
18cc0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
18cd0 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
18ce0 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56  Step6 = sqlite3V
18cf0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18d00 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18d10 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
18d20 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
18d30 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
18d40 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e  dSubexpr(pExpr->
18d50 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69  pLeft, i);.    i
18d60 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
18d70 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20  nBeNull(p) ){.  
18d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18d90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
18da0 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  ll, rLhs+i, dest
18db0 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64  Step2);.      Vd
18dc0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18dd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
18de0 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20  tep 3.  The LHS 
18df0 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20  is now known to 
18e00 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f  be non-NULL.  Do
18e10 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
18e20 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ch.  ** of the R
18e30 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53  HS using the LHS
18e40 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66   as a probe.  If
18e50 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75   found, the resu
18e60 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e  lt is.  ** true.
18e70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
18e80 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
18e90 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
18ea0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
18eb0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
18ec0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61  f table b-tree a
18ed0 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20  nd so we also.  
18ee0 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74    ** know that t
18ef0 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55  he RHS is non-NU
18f00 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63  LL.  Hence, we c
18f10 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61  ombine steps 3 a
18f20 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  nd 4.    ** into
18f30 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
18f40 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
18f50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18f60 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70  _SeekRowid, pExp
18f70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
18f80 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20  fFalse, rLhs);. 
18f90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18fa0 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74  v);.    addrTrut
18fb0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
18fc0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
18fd0 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20  to);  /* Return 
18fe0 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  True */.  }else{
18ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19000 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
19010 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65  inity, rLhs, nVe
19020 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e  ctor, 0, zAff, n
19030 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  Vector);.    if(
19040 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
19050 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  stIfNull ){.    
19060 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65    /* Combine Ste
19070 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69  p 3 and Step 5 i
19080 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
19090 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ode */.      sql
190a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
190b0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
190c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
190d0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20   destIfFalse,.  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
19100 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
19110 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19120 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
19130 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
19140 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72  .    }.    /* Or
19150 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66  dinary Step 3, f
19160 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
19170 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c  e FALSE and NULL
19180 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
19190 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
191a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
191b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
191c0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
191d0 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  le, 0,.         
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
19200 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
19210 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19220 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20  }..  /* Step 4. 
19230 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b   If the RHS is k
19240 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
19250 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e  ULL and we did n
19260 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20  ot find.  ** an 
19270 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61  match on the sea
19280 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  rch above, then 
19290 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
192a0 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20  be FALSE..  */. 
192b0 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
192c0 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29   && nVector==1 )
192d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
192e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
192f0 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
19300 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  ll, destIfFalse)
19310 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19320 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
19330 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20   Step 5.  If we 
19340 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
19350 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  t the difference
19360 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e   between NULL an
19370 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68  d.  ** FALSE, th
19380 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66  en just return f
19390 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  alse. .  */.  if
193a0 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
193b0 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69  estIfNull ) sqli
193c0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
193d0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20  estIfFalse);..  
193e0 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20  /* Step 6: Loop 
193f0 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20  through rows of 
19400 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72  the RHS.  Compar
19410 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68  e each row to th
19420 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61  e LHS..  ** If a
19430 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ny comparison is
19440 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
19450 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  result is NULL. 
19460 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d   If all.  ** com
19470 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c  parisons are FAL
19480 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61  SE then the fina
19490 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53  l result is FALS
194a0 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  E..  **.  ** For
194b0 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69   a scalar LHS, i
194c0 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
194d0 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68  to check just th
194e0 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a  e first row.  **
194f0 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
19500 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70  /.  if( destStep
19510 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52  6 ) sqlite3VdbeR
19520 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19530 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64  estStep6);.  add
19540 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
19550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
19560 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
19570 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
19580 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
19590 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65  ge(v);.  if( nVe
195a0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65  ctor>1 ){.    de
195b0 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69  stNotNull = sqli
195c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
195d0 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
195e0 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72    /* For nVector
195f0 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65  ==1, combine ste
19600 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d  ps 6 and 7 by im
19610 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
19620 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45  ing.    ** FALSE
19630 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   if the first co
19640 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
19650 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74  NULL */.    dest
19660 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66  NotNull = destIf
19670 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72  False;.  }.  for
19680 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
19690 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
196a0 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  *p;.    CollSeq 
196b0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
196c0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
196d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
196e0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
196f0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
19700 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
19710 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
19720 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
19730 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  se, p);.    sqli
19740 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19750 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
19760 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33  r->iTable, i, r3
19770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19780 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
19790 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
197a0 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
197d0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
197e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
197f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
19800 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19810 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
19820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19830 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19840 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
19850 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
19860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19870 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19880 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
19890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
198a0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
198b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
198c0 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64  drTop+1);.    Vd
198d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
198e0 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20      /* Step 7:  
198f0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
19900 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
19910 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
19920 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66  must.    ** be f
19930 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  alse. */.    sql
19940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19950 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
19960 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a  stIfFalse);.  }.
19970 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65  .  /* Jumps here
19980 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74   in order to ret
19990 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73  urn true. */.  s
199a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
199b0 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f  re(v, addrTruthO
199c0 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72  p);..sqlite3Expr
199d0 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a  CodeIN_finished:
199e0 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68  .  if( rLhs!=rLh
199f0 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52  sOrig ) sqlite3R
19a00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19a10 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73  arse, rLhs);.  s
19a20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19a30 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64  op(pParse);.  Vd
19a40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
19a50 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73  nd IN expr"));.s
19a60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19a70 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71  _oom_error:.  sq
19a80 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
19a90 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
19aa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19ab0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
19ac0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
19ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19ae0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
19af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
19b00 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
19b10 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
19b20 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
19b30 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
19b40 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
19b50 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
19b60 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
19b70 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
19b80 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
19b90 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
19ba0 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
19bb0 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
19bc0 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
19bd0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
19be0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
19bf0 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
19c00 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
19c10 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
19c20 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
19c30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
19c40 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
19c50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
19c60 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
19c70 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
19c80 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
19c90 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
19ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
19cb0 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
19cc0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
19cd0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
19ce0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
19cf0 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
19d00 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
19d10 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
19d20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
19d30 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
19d40 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
19d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d60 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c  4Dup8(v, OP_Real
19d70 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
19d80 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45  8*)&value, P4_RE
19d90 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
19da0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
19db0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
19dc0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
19dd0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
19de0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
19df0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
19e00 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
19e10 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
19e20 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
19e30 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
19e40 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
19e50 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
19e60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19e70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
19e80 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
19e90 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
19ea0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19eb0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
19ec0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
19ed0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
19ee0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
19ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
19f00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
19f10 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
19f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
19f40 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
19f50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
19f60 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
19f70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19f80 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
19f90 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
19fa0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
19fb0 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  = sqlite3DecOrHe
19fc0 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65  xToI64(z, &value
19fd0 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 31 20  );.    if( c==1 
19fe0 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21 6e 65 67  || (c==2 && !neg
19ff0 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c 61  Flag) || (negFla
1a000 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c  g && value==SMAL
1a010 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69  LEST_INT64)){.#i
1a020 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1a030 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1a040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1a050 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
1a060 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
1a070 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1a080 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
1a090 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53  .#else.#ifndef S
1a0a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
1a0b0 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28  NTEGER.      if(
1a0c0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1a0d0 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29  p(z,"0x",2)==0 )
1a0e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a0f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a100 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74  , "hex literal t
1a110 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e  oo big: %s%s", n
1a120 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29  egFlag?"-":"",z)
1a130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
1a140 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
1a150 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1a160 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
1a170 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  m);.      }.#end
1a180 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1a190 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1a1a0 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
1a1b0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
1a1c0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
1a1d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a1e0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
1a1f0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
1a200 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1a210 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a  4_INT64);.    }.
1a220 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61    }.}../*.** Era
1a230 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20  se column-cache 
1a240 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a  entry number i.*
1a250 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
1a260 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
1a270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1a280 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73   i){.  if( pPars
1a290 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1a2a0 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
1a2b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
1a2c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1a2d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
1a2e0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1a2f0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1a300 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1a310 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a320 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d  e[i].iReg;.    }
1a330 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1a340 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66  ColCache--;.  if
1a350 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1a360 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61  Cache ){.    pPa
1a370 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1a380 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1a390 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1a3a0 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a  olCache];.  }.}.
1a3b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
1a3c0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
1a3d0 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
1a3e0 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
1a3f0 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
1a400 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
1a410 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
1a420 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
1a430 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1a440 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
1a450 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
1a460 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
1a470 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
1a480 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
1a490 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
1a4a0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1a4b0 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  p;..  /* Unless 
1a4c0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a4d0 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72 20  urred, register 
1a4e0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
1a4f0 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a  ys positive. */.
1a500 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
1a510 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a520 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a530 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a540 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
1a550 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
1a560 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
1a570 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
1a580 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
1a590 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
1a5a0 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
1a5b0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
1a5c0 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
1a5d0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
1a5e0 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
1a5f0 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
1a600 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
1a610 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
1a620 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
1a630 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
1a640 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1a650 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
1a660 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
1a670 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20  _ColumnCache) ) 
1a680 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
1a690 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
1a6a0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
1a6b0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
1a6c0 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
1a6d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
1a6e0 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
1a6f0 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
1a700 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
1a710 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
1a720 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
1a730 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
1a740 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
1a750 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
1a760 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
1a770 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a780 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1a790 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1a7a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a7b0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
1a7c0 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
1a7d0 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
1a7e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
1a7f0 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20 66  che is already f
1a800 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ull, delete the 
1a810 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75  least recently u
1a820 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  sed entry */.  i
1a830 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  f( pParse->nColC
1a840 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43  ache>=SQLITE_N_C
1a850 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d  OLCACHE ){.    m
1a860 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66  inLru = 0x7fffff
1a870 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d  ff;.    idxLru =
1a880 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   -1;.    for(i=0
1a890 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1a8a0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1a8b0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1a8c0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1a8d0 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
1a8e0 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72 75  {.        idxLru
1a8f0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69   = i;.        mi
1a900 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
1a910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a920 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
1a930 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
1a940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1a950 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
1a960 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f  ache[pParse->nCo
1a970 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a  lCache++];.  }..
1a980 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1a990 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e   entry to the en
1a9a0 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a  d of the cache *
1a9b0 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20  /.  p->iLevel = 
1a9c0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a9d0 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  vel;.  p->iTable
1a9e0 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43   = iTab;.  p->iC
1a9f0 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
1aa00 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
1aa10 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1aa20 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61  ;.  p->lru = pPa
1aa30 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1aa40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
1aa50 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
1aa60 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
1aa70 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
1aa80 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
1aa90 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
1aaa0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
1aab0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
1aac0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
1aad0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1aae0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
1aaf0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1ab00 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
1ab10 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
1ab20 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  le( i<pParse->nC
1ab30 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73  olCache ){.    s
1ab40 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1ab50 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43  *p = &pParse->aC
1ab60 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
1ab70 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69  if( p->iReg >= i
1ab80 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c  Reg && p->iReg <
1ab90 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20   iReg+nReg ){.  
1aba0 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
1abb0 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ear(pParse, i);.
1abc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1abd0 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
1abe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
1abf0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
1ac00 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
1ac10 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
1ac20 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
1ac30 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
1ac40 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
1ac50 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
1ac60 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
1ac70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
1ac80 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
1ac90 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1aca0 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
1acb0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
1acc0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
1acd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1ace0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1acf0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1ad00 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1ad10 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1ad20 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
1ad30 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
1ad40 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
1ad50 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
1ad60 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
1ad70 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
1ad80 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
1ad90 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
1ada0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
1adb0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1adc0 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
1add0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ade0 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
1adf0 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
1ae00 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
1ae10 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
1ae20 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
1ae30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ae40 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
1ae50 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  e){.  int i = 0;
1ae60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1ae70 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
1ae80 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  1 );.  pParse->i
1ae90 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69  CacheLevel--;.#i
1aea0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1aeb0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1aec0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1aed0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1aee0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1aef0 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
1af00 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1af10 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1af20 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72  .  while( i<pPar
1af30 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1af40 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1af50 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c  >aColCache[i].iL
1af60 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
1af70 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
1af80 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1af90 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  r(pParse, i);.  
1afa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1afb0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1afc0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
1afd0 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
1afe0 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
1aff0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
1b000 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
1b010 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
1b020 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
1b030 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
1b040 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
1b050 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
1b060 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
1b070 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
1b080 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
1b090 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
1b0a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1b0b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1b0c0 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
1b0d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1b0e0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1b0f0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1b100 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1b110 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1b120 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1b130 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1b140 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1b150 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
1b160 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1b170 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1b180 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1b190 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1b1a0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1b1b0 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1b1c0 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1b1d0 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1b1e0 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1b1f0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1b200 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b210 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1b220 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1b230 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1b240 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b250 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1b260 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1b270 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1b280 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1b290 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1b2a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1b2b0 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1b2c0 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1b2d0 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1b2e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1b2f0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1b300 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1b310 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1b320 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1b330 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1b340 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1b350 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1b360 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1b370 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1b380 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1b390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1b3a0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1b3b0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1b3c0 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1b3d0 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1b3e0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1b3f0 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20   = iTabCur;.    
1b400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1b410 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
1b420 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
1b430 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
1b440 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
1b450 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b460 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1b470 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ble(pParse->pVdb
1b480 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  e, pIdx->pTable,
1b490 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20   iTabCur,.      
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
1b4c0 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a  abCol, regOut);.
1b4d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1b4e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
1b4f0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1b500 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
1b510 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
1b520 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b530 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1b540 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
1b550 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
1b560 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
1b570 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b580 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1b590 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
1b5a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1b5b0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
1b5c0 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Cur,    /* The t
1b5d0 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72  able cursor.  Or
1b5e0 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66   the PK cursor f
1b5f0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1b600 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
1b610 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1b620 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
1b630 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
1b640 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1b650 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1b660 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  e into this regi
1b670 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
1b680 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
1b690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b6a0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1b6b0 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72  iTabCur, iCol, r
1b6c0 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  egOut);.    retu
1b6d0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  rn;.  }.  if( iC
1b6e0 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
1b6f0 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
1b700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b710 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1b720 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
1b730 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1b740 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
1b750 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
1b760 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
1b770 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43  ;.    int x = iC
1b780 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73  ol;.    if( !Has
1b790 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21  Rowid(pTab) && !
1b7a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1b7b0 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c  ){.      x = sql
1b7c0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1b7d0 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  x(sqlite3Primary
1b7e0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20  KeyIndex(pTab), 
1b7f0 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol);.    }.   
1b800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b810 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75  p3(v, op, iTabCu
1b820 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20  r, x, regOut);. 
1b830 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
1b840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
1b850 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
1b860 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  pTab, iCol, regO
1b870 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1b880 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b890 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
1b8a0 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
1b8b0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
1b8c0 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
1b8d0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1b8e0 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73  value in a regis
1b8f0 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ter. .**.** An e
1b900 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
1b910 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1b920 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  n value in regis
1b930 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a  ter iReg.  This.
1b940 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74  ** is not garant
1b950 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75  eeed for GetColu
1b960 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c  mn() - the resul
1b970 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  t can be stored 
1b980 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74  in.** any regist
1b990 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73  er.  But the res
1b9a0 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  ult is guarantee
1b9b0 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67  d to land in reg
1b9c0 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f  ister iReg.** fo
1b9d0 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  r GetColumnToReg
1b9e0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ()..**.** There 
1b9f0 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
1ba00 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
1ba10 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
1ba20 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
1ba30 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
1ba40 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
1ba50 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
1ba60 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
1ba70 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
1ba80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ba90 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
1baa0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1bab0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1bac0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1bad0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1bae0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1baf0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1bb00 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1bb10 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1bb20 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1bb30 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1bb40 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1bb50 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1bb60 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1bb70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1bb80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1bb90 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
1bba0 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1bbb0 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
1bbc0 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
1bbd0 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
1bbe0 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20   + FLAGS */.){. 
1bbf0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1bc00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1bc10 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1bc20 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
1bc30 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1bc40 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1bc50 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1bc60 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1bc70 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  f( p->iTable==iT
1bc80 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
1bc90 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
1bca0 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
1bcb0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1bcc0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
1bcd0 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
1bce0 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e  ster(pParse, p->
1bcf0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74  iReg);.      ret
1bd00 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
1bd10 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
1bd20 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
1bd30 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1bd40 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
1bd50 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
1bd60 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1bd70 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
1bd80 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1bd90 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73  5(v, p5);.  }els
1bda0 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  e{   .    sqlite
1bdb0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1bdc0 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20  pParse, iTable, 
1bdd0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
1bde0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1bdf0 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  g;.}.void sqlite
1be00 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1be10 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65  mnToReg(.  Parse
1be20 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1be30 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1be40 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1be50 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1be60 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1be70 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1be80 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1be90 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1bea0 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1beb0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1bec0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1bed0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1bee0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1bef0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1bf00 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1bf10 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg         /* S
1bf20 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1bf30 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31  e */.){.  int r1
1bf40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bf50 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1bf60 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  se, pTab, iColum
1bf70 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c  n, iTable, iReg,
1bf80 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69   0);.  if( r1!=i
1bf90 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64 62  Reg ) sqlite3Vdb
1bfa0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
1bfb0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
1bfc0 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a   r1, iReg);.}...
1bfd0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20  /*.** Clear all 
1bfe0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74  column cache ent
1bff0 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ries..*/.void sq
1c000 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1c010 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
1c020 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  e){.  int i;..#i
1c030 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c040 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1c050 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1c060 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1c070 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1c080 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a  "CLEAR\n");.  }.
1c090 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
1c0a0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
1c0b0 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Cache; i++){.   
1c0c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
1c0d0 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65  lCache[i].tempRe
1c0e0 67 0a 20 20 20 20 20 26 26 20 70 50 61 72 73 65  g.     && pParse
1c0f0 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
1c100 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
1c110 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20 20  mpReg).    ){.  
1c120 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65       pParse->aTe
1c130 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
1c140 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72  empReg++] = pPar
1c150 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1c160 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .iReg;.    }.  }
1c170 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  .  pParse->nColC
1c180 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ache = 0;.}../*.
1c190 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
1c1a0 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
1c1b0 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
1c1c0 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
1c1d0 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
1c1e0 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
1c1f0 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
1c200 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1c210 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
1c220 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c230 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
1c240 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
1c250 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
1c260 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
1c270 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
1c280 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1c290 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
1c2a0 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
1c2b0 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
1c2c0 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
1c2d0 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
1c2e0 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
1c2f0 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
1c300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c310 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
1c320 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1c330 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
1c340 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72  t nReg){.  asser
1c350 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
1c360 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
1c370 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
1c380 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
1c390 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
1c3a0 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
1c3b0 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65   nReg);.  sqlite
1c3c0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1c3d0 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20  (pParse, iFrom, 
1c3e0 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  nReg);.}..#if de
1c3f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1c400 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1c410 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
1c420 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1c430 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65  n true if any re
1c440 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
1c450 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28  nge iFrom..iTo (
1c460 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73  inclusive).** is
1c470 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
1c480 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1c490 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1c4a0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69  utine is used wi
1c4b0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e  thin assert() an
1c4c0 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
1c4d0 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20  ros only.** and 
1c4e0 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
1c4f0 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  in a normal buil
1c500 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c510 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1c520 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
1c530 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1c540 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iTo){.  int i;.
1c550 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1c560 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
1c570 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1c580 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1c590 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1c5a0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
1c5b0 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
1c5c0 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
1c5d0 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
1c5e0 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  1;    /*NO_TEST*
1c5f0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  /.  }.  return 0
1c600 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1c610 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51  LITE_DEBUG || SQ
1c620 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
1c630 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ST */.../*.** Co
1c640 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65  nvert a scalar e
1c650 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
1c660 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20  o a TK_REGISTER 
1c670 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72  referencing.** r
1c680 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1c690 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1c6a0 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20  nsure that iReg 
1c6b0 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
1c6c0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1c6d0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78  value for the ex
1c6e0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
1c6f0 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52  tic void exprToR
1c700 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c  egister(Expr *p,
1c710 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d   int iReg){.  p-
1c720 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  >op2 = p->op;.  
1c730 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  p->op = TK_REGIS
1c740 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  TER;.  p->iTable
1c750 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43   = iReg;.  ExprC
1c760 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20  learProperty(p, 
1c770 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a  EP_Skip);.}../*.
1c780 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65  ** Evaluate an e
1c790 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65  xpression (eithe
1c7a0 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20  r a vector or a 
1c7b0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1c7c0 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  n) and store.** 
1c7d0 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f  the result in co
1c7e0 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72  ntinguous tempor
1c7f0 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20  ary registers.  
1c800 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1c810 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   of.** the first
1c820 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74   register used t
1c830 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1c840 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
1c850 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1c860 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
1c870 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c  emporary scalar,
1c880 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65   then also write
1c890 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65  .** that registe
1c8a0 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  r number into *p
1c8b0 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74  iFreeable.  If t
1c8c0 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1c8d0 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69  lt register.** i
1c8e0 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
1c8f0 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  y or if the expr
1c900 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74  ession is a vect
1c910 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62  or set *piFreeab
1c920 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73  le.** to 0..*/.s
1c930 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
1c940 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a  deVector(Parse *
1c950 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
1c960 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65   int *piFreeable
1c970 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74  ){.  int iResult
1c980 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20  ;.  int nResult 
1c990 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
1c9a0 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66  torSize(p);.  if
1c9b0 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a  ( nResult==1 ){.
1c9c0 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1c9d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c9e0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46  p(pParse, p, piF
1c9f0 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73  reeable);.  }els
1ca00 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62  e{.    *piFreeab
1ca10 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  le = 0;.    if( 
1ca20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
1ca30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   ){.      iResul
1ca40 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  t = sqlite3CodeS
1ca50 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1ca60 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   p, 0, 0);.    }
1ca70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1ca80 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  i;.      iResult
1ca90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1caa0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
1cab0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
1cac0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1cad0 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29   i<nResult; i++)
1cae0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1caf0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
1cb00 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78  ble(pParse, p->x
1cb10 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
1cb20 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a  pr, i+iResult);.
1cb30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cb40 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75  }.  return iResu
1cb50 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  lt;.}.../*.** Ge
1cb60 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
1cb70 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
1cb80 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cb90 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1cba0 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
1cbb0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1cbc0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1cbd0 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
1cbe0 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1cbf0 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
1cc00 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
1cc10 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
1cc20 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
1cc30 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1cc40 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
1cc50 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
1cc60 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1cc70 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
1cc80 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
1cc90 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
1cca0 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
1ccb0 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
1ccc0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
1ccd0 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
1cce0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
1ccf0 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
1cd00 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
1cd10 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
1cd20 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1cd30 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
1cd40 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1cd50 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1cd60 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1cd70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
1cd80 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
1cd90 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1cda0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1cdc0 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
1cdd0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
1cde0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
1cdf0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
1ce00 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
1ce10 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
1ce20 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1ce30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1ce40 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1ce50 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1ce60 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
1ce70 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
1ce80 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1ce90 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1cea0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1ceb0 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20  /.  int r1, r2; 
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ced0 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
1cee0 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45  r numbers */.  E
1cef0 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
1cf00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1cf10 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
1cf20 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   node */.  int p
1cf30 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  5 = 0;..  assert
1cf40 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
1cf50 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
1cf60 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
1cf70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1cf80 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1cf90 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1cfa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1cfb0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1cfc0 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1cfd0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1cfe0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1cff0 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1d000 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1d010 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1d020 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
1d030 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
1d040 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
1d050 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1d060 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
1d070 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
1d080 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
1d090 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
1d0a0 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
1d0b0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
1d0c0 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
1d0d0 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e     return pCol->
1d0e0 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iMem;.      }els
1d0f0 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
1d100 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
1d110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d120 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1d130 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
1d140 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
1d150 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1d180 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1d190 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1d1a0 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1d1b0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1d1c0 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1d1d0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1d1e0 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1d1f0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1d200 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1d210 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1d220 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
1d230 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
1d240 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  f( pParse->ckBas
1d250 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1d260 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
1d270 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
1d280 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
1d290 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
1d2a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
1d2b0 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c  turn pExpr->iCol
1d2c0 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
1d2d0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  Base;.        }e
1d2e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1d2f0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1d300 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1d310 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1d320 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1d330 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1d340 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1d350 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1d360 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1d370 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1d380 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1d390 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1d3a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d3b0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1d3c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d3d0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1d3e0 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1d410 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
1d420 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1d450 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op2);.    }.   
1d460 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1d470 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
1d480 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
1d490 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
1d4a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1d4b0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1d4c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d4d0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1d4e0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1d4f0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1d500 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1d510 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1d520 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1d530 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
1d540 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1d550 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1d560 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1d570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d580 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1d590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1d5a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d5b0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1d5c0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1d5d0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1d5e0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1d5f0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1d600 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1d610 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1d620 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1d630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d640 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1d650 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1d660 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1d670 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1d680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1d690 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1d6a0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1d6b0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1d6c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1d6d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1d6e0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1d6f0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1d700 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1d710 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1d720 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d730 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1d740 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1d750 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1d760 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1d770 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1d780 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1d790 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1d7a0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1d7b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1d7c0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1d7d0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1d7e0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1d7f0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1d800 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1d810 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1d820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d830 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1d840 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1d850 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1d860 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
1d870 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d880 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1d890 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1d8a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1d8b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d8c0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1d8d0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1d8e0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1d8f0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
1d900 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d910 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
1d920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
1d940 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
1d950 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
1d960 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1d970 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
1d980 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1d990 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1d9a0 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
1d9b0 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
1d9c0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1d9d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d9e0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1d9f0 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74  en[0]=='?' || st
1da00 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
1da10 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20  oken, z)==0 );. 
1da20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
1da30 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a  VList[0] = 0; /*
1da40 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20   Indicate VList 
1da50 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  may no longer be
1da60 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20   enlarged */.   
1da70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da80 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61  AppendP4(v, (cha
1da90 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29  r*)z, P4_STATIC)
1daa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dab0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1dac0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dad0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1dae0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1daf0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23  >iTable;.    }.#
1db00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1db10 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1db20 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1db30 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1db40 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1db50 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1db60 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
1db70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1db80 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1db90 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1dba0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1dbb0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1dbc0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1dbd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dbe0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
1dbf0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1dc00 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1dc10 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1dc20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dc30 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
1dc40 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1dc70 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1dc80 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
1dc90 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
1dca0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
1dcb0 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
1dcc0 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
1dcd0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1dce0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1dcf0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
1dd00 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67      return inReg
1dd10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1dd20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1dd30 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1dd40 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1dd50 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f  K_ISNOT:.      o
1dd60 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1dd70 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1dd80 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49  .      p5 = SQLI
1dd90 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
1dda0 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68   /* fall-through
1ddb0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1ddc0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1ddd0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1dde0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1ddf0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1de00 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1de10 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EQ: {.      Expr
1de20 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1de30 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  >pLeft;.      if
1de40 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1de50 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a  ector(pLeft) ){.
1de60 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74          codeVect
1de70 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  orCompare(pParse
1de80 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1de90 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20   op, p5);.      
1dea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1deb0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1dec0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ded0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1def0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1df00 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1df10 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1df20 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ree2);.        c
1df30 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1df40 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  e, pLeft, pExpr-
1df50 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1df60 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1df70 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
1df80 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
1df90 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1dfa0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1dfb0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1dfc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1dfd0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1dfe0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1dff0 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1e000 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1e010 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e020 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1e030 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e040 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1e050 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1e060 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e070 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1e080 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e090 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1e0a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1e0b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e0c0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1e0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e0e0 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1e0f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1e100 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e110 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1e120 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e130 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
1e140 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
1e150 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e160 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
1e170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e180 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e190 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e1a0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1e1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1e1c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e1d0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
1e1e0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
1e1f0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
1e200 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
1e210 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1e220 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
1e230 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
1e240 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
1e250 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
1e260 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
1e270 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1e280 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
1e290 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
1e2a0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
1e2b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
1e2c0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
1e2d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e2e0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
1e2f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e300 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
1e310 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e320 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
1e330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e340 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
1e350 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
1e360 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
1e370 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1e380 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
1e390 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
1e3a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e3b0 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
1e3c0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
1e3d0 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
1e3e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3f0 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
1e400 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1e410 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
1e420 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e430 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
1e440 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e450 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
1e460 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
1e470 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e480 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
1e490 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
1e4a0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
1e4b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e4c0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
1e4d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1e4e0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
1e4f0 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
1e500 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
1e510 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e520 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
1e530 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
1e540 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e550 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
1e560 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
1e570 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
1e580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e590 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
1e5a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e5b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e5c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e5d0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1e5e0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1e5f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e600 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e610 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1e620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e630 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1e640 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1e650 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e660 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e670 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e680 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e690 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e6a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e6b0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1e6c0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1e6d0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1e6e0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1e6f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1e700 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1e710 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
1e720 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1e730 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
1e740 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1e750 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e  urn target;.#ifn
1e760 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e770 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1e780 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1e790 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1e7a0 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1e7b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e7c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e7d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e7e0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1e7f0 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1e800 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 1, target);. 
1e810 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1e820 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rget;.#endif.   
1e830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e840 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1e850 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1e860 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1e870 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1e880 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1e890 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1e8a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1e8b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e8c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1e8d0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1e8e0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1e8f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e900 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e910 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e920 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1e930 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e940 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1e950 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1e960 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e970 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1e990 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e9a0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1e9b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1e9c0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e9d0 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1e9e0 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1e9f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1ea00 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1ea10 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1ea20 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1ea30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1ea40 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1ea50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ea60 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ea70 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ea80 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1ea90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1eaa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1eab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eac0 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1ead0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eae0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1eaf0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1eb00 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1eb10 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
1eb20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1eb30 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1eb40 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
1eb50 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1eb60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eb70 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1eb80 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
1eb90 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1eba0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
1ebb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ebc0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1ebd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1ebe0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ebf0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ec00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1ec10 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1ec20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ec30 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
1ec40 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1ec50 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
1ec60 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1ec70 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ec80 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1ec90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1eca0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1ecb0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1ecc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ecd0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
1ece0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1ecf0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1ed00 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
1ed10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ed20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1ed30 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1ed40 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
1ed50 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1ed60 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
1ed70 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
1ed80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ed90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1eda0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1edb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1edc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1edd0 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
1ede0 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
1edf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ee00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ee10 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
1ee20 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
1ee30 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
1ee40 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1ee50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ee60 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1ee70 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1ee80 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1ee90 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1eea0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1eeb0 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
1eec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1eed0 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
1eee0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1eef0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
1ef00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1ef10 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
1ef20 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
1ef30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ef40 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
1ef50 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
1ef60 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
1ef70 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
1ef80 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
1ef90 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1efa0 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
1efb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1efe0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1eff0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1f000 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
1f010 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1f020 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
1f030 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
1f040 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
1f050 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
1f060 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
1f070 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1f080 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
1f090 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1f0a0 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ce */..      if(
1f0b0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
1f0c0 50 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65  Parse) && sqlite
1f0d0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
1f0e0 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b  otJoin(pExpr) ){
1f0f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20  .        /* SQL 
1f100 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
1f110 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74   expensive. So t
1f120 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74  ry to move const
1f130 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  ant functions.  
1f140 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20        ** out of 
1f150 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20  the inner loop, 
1f160 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
1f170 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43  ns an extra OP_C
1f180 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  opy. */.        
1f190 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
1f1a0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
1f1b0 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
1f1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1f1d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f1e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1f1f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1f200 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1f210 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1f220 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
1f230 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1f240 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1f250 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1f260 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1f270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f280 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
1f290 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
1f2a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f2b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f2c0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f2d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
1f2e0 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
1f2f0 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  ken;.      pDef 
1f300 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
1f310 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
1f320 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23  Farg, enc, 0);.#
1f330 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f340 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f  BLE_UNKNOWN_SQL_
1f350 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69  FUNCTION.      i
1f360 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50  f( pDef==0 && pP
1f370 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1f380 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1f390 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1f3a0 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e  ion(db, "unknown
1f3b0 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  ", nFarg, enc, 0
1f3c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1f3d0 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
1f3e0 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69  ==0 || pDef->xFi
1f3f0 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20  nalize!=0 ){.   
1f400 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1f410 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1f420 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
1f430 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20  %s()", zId);.   
1f440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f450 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
1f460 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
1f470 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1f480 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
1f490 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
1f4a0 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
1f4b0 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
1f4c0 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
1f4d0 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  ry evaluation of
1f4e0 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
1f4f0 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
1f500 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
1f510 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1f520 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1f530 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1f540 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
1f550 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
1f560 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
1f570 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f580 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
1f590 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
1f5a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f5b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1f5c0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
1f5d0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1f5e0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
1f5f0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
1f600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f610 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f620 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
1f630 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
1f640 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1f650 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1f660 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f670 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1f680 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
1f690 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f6a0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1f6b0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
1f6c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f6d0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1f6e0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
1f6f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
1f700 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f710 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1f720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1f730 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1f740 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
1f750 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
1f760 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1f770 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
1f780 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
1f790 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
1f7a0 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
1f7b0 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
1f7c0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f7d0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1f7e0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1f7f0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1f800 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
1f810 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f820 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
1f830 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1f840 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1f850 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
1f860 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
1f870 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rget);.      }..
1f880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1f890 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  BUG.      /* The
1f8a0 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63   AFFINITY() func
1f8b0 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  tion evaluates t
1f8c0 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
1f8d0 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20  describes.      
1f8e0 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69  ** the type affi
1f8f0 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75  nity of the argu
1f900 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75  ment.  This is u
1f910 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1f920 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
1f930 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69  SQLite type logi
1f940 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
1f950 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1f960 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1f970 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a  UNC_AFFINITY ){.
1f980 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1f990 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20  ar *azAff[] = { 
1f9a0 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20  "blob", "text", 
1f9b0 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65  "numeric", "inte
1f9c0 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a  ger", "real" };.
1f9d0 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
1f9e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f9f0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
1fa00 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
1fa10 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1fa20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1fa30 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
1fa40 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1fa50 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20  g(v, target, .  
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20              aff 
1fa80 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49  ? azAff[aff-SQLI
1fa90 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22  TE_AFF_BLOB] : "
1faa0 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20  none");.        
1fab0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1fac0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1fad0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1fae0 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1faf0 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
1fb00 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1fb10 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
1fb20 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
1fb30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1fb40 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
1fb50 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
1fb60 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
1fb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fb80 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
1fb90 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1fba0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
1fbb0 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
1fbc0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1fbd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1fbe0 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
1fbf0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1fc00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fc10 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1fc20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1fc30 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
1fc40 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
1fc50 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1fc60 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1fc70 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
1fc80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fc90 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fca0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1fcb0 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
1fcc0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1fcd0 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
1fce0 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
1fcf0 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
1fd00 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
1fd10 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
1fd20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
1fd30 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
1fd40 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
1fd50 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
1fd60 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
1fd70 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
1fd80 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
1fd90 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
1fda0 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
1fdb0 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
1fdc0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
1fdd0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1fde0 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
1fdf0 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
1fe00 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
1fe10 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
1fe20 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
1fe30 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
1fe40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1fe50 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
1fe60 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
1fe70 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
1fe80 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1fe90 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
1fea0 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
1feb0 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
1fec0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1fed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fee0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1fef0 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
1ff00 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1ff20 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
1ff30 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
1ff40 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
1ff50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ff60 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1ff70 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
1ff80 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
1ff90 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
1ffa0 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1ffd0 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
1ffe0 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
1fff0 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
20000 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
20010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20020 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20030 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
20040 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
20050 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
20060 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
20070 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
20080 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
200b0 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
200c0 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
200d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
200e0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
200f0 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
20100 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
20110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20120 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
20130 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20140 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
20150 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
20160 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
20170 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
20180 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
20190 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
201a0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
201b0 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
201c0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
201d0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
201e0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
201f0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
20200 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
20210 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
20220 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
20230 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
20240 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
20250 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
20260 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
20270 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
20280 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
20290 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
202a0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
202b0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
202c0 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
202d0 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
202e0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
202f0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
20300 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
20310 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
20320 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
20330 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
20340 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
20350 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
20360 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
20370 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
20380 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
20390 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
203a0 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
203b0 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
203c0 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
203d0 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
203e0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
203f0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
20400 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
20410 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
20420 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
20430 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
20440 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
20450 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
20460 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
20470 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
20480 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
20490 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
204a0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
204b0 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
204c0 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
204d0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
204e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
204f0 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
20500 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
20510 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
20520 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
20530 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
20540 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
20550 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
20560 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20570 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
20580 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
20590 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
205a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
205b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
205c0 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  (v, OP_Function0
205d0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
205e0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
20610 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
20620 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
20630 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
20640 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
20650 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
20660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
20670 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20680 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
20690 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
206a0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
206b0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
206c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
206d0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
206e0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
206f0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
20700 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  T: {.      int n
20710 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
20720 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
20730 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
20740 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
20750 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ECT );.      if(
20760 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26   op==TK_SELECT &
20770 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d  & (nCol = pExpr-
20780 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
20790 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b  st->nExpr)!=1 ){
207a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
207b0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
207c0 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b  Parse, nCol, 1);
207d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
207e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
207f0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
20800 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
20810 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
20820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20830 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
20840 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
20850 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
20860 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
20870 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
20880 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
20890 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
208a0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
208b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
208c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30  xpr->pLeft, 0, 0
208d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
208e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
208f0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
20900 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
20910 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
20920 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
20930 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45  ble.       && pE
20940 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20  xpr->iTable!=(n 
20950 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
20960 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
20970 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b  Left)) .      ){
20980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
209a0 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
209b0 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
209c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
209f0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
20a00 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
20a10 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
20a20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
20a30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20a40 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
20a50 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
20a60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20a70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20a80 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
20a90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20aa0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20ac0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
20ad0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20ae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
20af0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
20b00 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
20b10 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
20b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20b30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
20b40 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
20b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20b60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
20b70 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
20b80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20b90 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
20ba0 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
20bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20bc0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
20bd0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
20be0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
20bf0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20c00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
20c10 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
20c20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
20c30 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
20c40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
20c50 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
20c60 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
20c70 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
20c80 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
20c90 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
20ca0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
20cb0 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
20cc0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
20cd0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
20ce0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
20cf0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
20d00 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
20d10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
20d20 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
20d30 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
20d40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20d50 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20  target, 0, 0);. 
20d60 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
20d70 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
20d80 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20  se TK_SPAN:.    
20d90 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
20da0 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
20db0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LUS: {.      ret
20dc0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
20dd0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
20de0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20df0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a  target);.    }..
20e00 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
20e10 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
20e20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
20e30 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
20e40 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
20e50 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
20e60 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
20e70 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
20e80 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
20e90 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
20ea0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
20eb0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
20ec0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
20ed0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
20ee0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
20ef0 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
20f00 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
20f10 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
20f20 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
20f30 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
20f40 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
20f50 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
20f60 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
20f70 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
20f80 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
20f90 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
20fa0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20fb0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
20fc0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
20fd0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
20fe0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
20ff0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
21000 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
21010 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
21020 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
21030 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
21040 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
21050 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
21060 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
21070 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
21080 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
21090 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
210a0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
210b0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
210c0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
210d0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
210e0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
210f0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
21100 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
21110 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
21120 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
21130 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
21140 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
21150 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
21160 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
21170 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
21180 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
21190 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
211a0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
211b0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
211c0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
211d0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
211e0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
211f0 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
21200 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
21210 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
21220 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
21230 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
21240 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
21250 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
21260 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
21270 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
21280 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
21290 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
212a0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
212b0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
212c0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
212d0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
212e0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
212f0 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
21300 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
21310 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
21320 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
21330 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
21340 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
21350 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
21360 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
21370 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
21380 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
21390 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
213a0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
213b0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
213c0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
213d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
213e0 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
213f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
21400 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
21410 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
21420 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
21430 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
21440 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
21450 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
21460 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
21470 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
21480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21490 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
214a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
214b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
214c0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
214d0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
214e0 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
214f0 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
21500 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
21510 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
21520 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
21530 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
21540 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
21550 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
21560 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
21570 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
21580 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
21590 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
215a0 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
215b0 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
215c0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
215d0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
215e0 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
215f0 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
21600 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
21610 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a  ly real..      *
21620 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
21630 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d  NCE-OF: R-60985-
21640 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c  57662 SQLite wil
21650 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61  l convert the va
21660 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20  lue back to.    
21670 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
21680 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74  int when extract
21690 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ing it from the 
216a0 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20  record.  */.    
216b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
216c0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
216d0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
216e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
216f0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
21700 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
21710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21720 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21730 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
21740 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
21750 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
21760 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
21770 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b  ase TK_VECTOR: {
21780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
21790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
217a0 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
217b0 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d");.      break
217c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
217d0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
217e0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
217f0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
21800 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
21810 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
21820 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
21830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
21840 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
21850 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
21860 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
21870 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
21880 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
21890 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
218a0 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
218b0 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
218c0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
218d0 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
218e0 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
218f0 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
21900 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
21910 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
21920 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
21930 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
21940 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
21950 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
21960 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
21970 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
21980 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
21990 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
219a0 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
219b0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
219c0 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
219d0 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
219e0 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
219f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
21a00 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
21a10 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
21a20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
21a30 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
21a40 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
21a50 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
21a60 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
21a70 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
21a80 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
21a90 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
21aa0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
21ab0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
21ac0 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
21ad0 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
21ae0 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
21af0 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
21b00 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
21b10 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
21b20 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
21b30 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
21b40 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
21b50 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
21b60 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
21b70 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
21b80 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
21b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ba0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
21bb0 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
21bc0 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
21bd0 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
21c00 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
21c10 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
21c20 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c40 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
21c50 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
21c60 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21c90 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
21ca0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
21cd0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
21ce0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
21cf0 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
21d00 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
21d10 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
21d20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
21d50 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
21d60 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
21d90 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
21da0 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
21db0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21dc0 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
21dd0 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
21de0 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
21df0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
21e00 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
21e10 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
21e20 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
21e30 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
21e40 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21e50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
21e60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
21e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
21e80 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
21e90 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
21ea0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
21eb0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
21ec0 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
21ed0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
21ee0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
21ef0 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
21f00 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
21f10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
21f20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
21f30 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
21f40 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
21f50 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
21f60 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
21f70 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
21f80 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
21f90 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72  ter(&tempX, expr
21fa0 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
21fb0 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
21fc0 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
21fd0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
21fe0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
21ff0 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61   memset(&opCompa
22000 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70  re, 0, sizeof(op
22010 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20  Compare));.     
22020 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
22030 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
22040 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
22050 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
22060 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
22070 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
22080 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
22090 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
220a0 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
220b0 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
220c0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
220d0 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
220e0 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
220f0 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
22100 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
22110 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
22120 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
22130 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
22140 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
22150 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
22160 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
22170 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
22180 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
22190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
221a0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
221b0 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
221c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
221d0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
221e0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
221f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
22200 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
22210 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
22220 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
22230 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
22240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22250 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
22260 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
22270 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
22280 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
22290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
222a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
222b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
222c0 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
222d0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
222e0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
222f0 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
22300 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
22310 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
22320 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22330 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
22340 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
22350 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
22360 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22370 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
22380 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
22390 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
223a0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
223b0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
223c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
223d0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
223e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
223f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
22400 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
22410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22420 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b   (nExpr&1)!=0 ){
22430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22440 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
22450 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
22460 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22470 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
22480 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c  [nExpr-1].pExpr,
22490 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
224a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
224b0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
224c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
224d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
224e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
224f0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
22500 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
22510 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
22520 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
22530 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a  pParse->nErr>0 .
22540 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
22550 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
22560 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29  l==iCacheLevel )
22570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22580 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
22590 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
225a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
225b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
225c0 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
225d0 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
225e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
225f0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
22600 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20  =OE_Rollback .  
22610 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
22620 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
22630 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20  Abort.          
22640 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
22650 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ity==OE_Fail.   
22660 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
22670 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
22680 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
22690 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
226a0 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
226b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
226c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
226d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
226e0 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
226f0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
22700 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
22710 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
22720 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
22730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22740 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
22750 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  y==OE_Abort ){. 
22760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
22770 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
22780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
22790 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
227a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
227b0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
227c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
227d0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
227e0 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
227f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
22800 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20  .            v, 
22810 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
22820 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30  OK, OE_Ignore, 0
22830 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
22840 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  n,0);.        Vd
22850 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
22860 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22870 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
22880 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
22890 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
228a0 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20  INT_TRIGGER,.   
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
228d0 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
228e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
228f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
22900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22910 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
22920 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22930 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
22940 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
22950 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
22960 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
22970 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
22980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72  .}../*.** Factor
22990 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66   out the code of
229a0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
229b0 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c  ssion to initial
229c0 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a  ization time..**
229d0 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d  .** If regDest>=
229e0 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  0 then the resul
229f0 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72  t is always stor
22a00 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ed in that regis
22a10 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72  ter and the.** r
22a20 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75  esult is not reu
22a30 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65  sable.  If regDe
22a40 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72  st<0 then this r
22a50 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20 74  outine is free t
22a60 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  o .** store the 
22a70 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72 20  value whereever 
22a80 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72  it wants.  The r
22a90 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74 68  egister where th
22aa0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a  e expression .**
22ab0 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72 65   is stored is re
22ac0 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65  turned.  When re
22ad0 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65  gDest<0, two ide
22ae0 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f  ntical expressio
22af0 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20  ns will.** code 
22b00 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67 69  to the same regi
22b10 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
22b20 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
22b30 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  it(.  Parse *pPa
22b40 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
22b50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22b60 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
22b70 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
22b80 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e  ion to code when
22b90 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61   the VDBE initia
22ba0 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  lizes */.  int r
22bb0 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20  egDest       /* 
22bc0 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
22bd0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
22be0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
22bf0 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t *p;.  assert( 
22c00 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
22c10 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70  arse) );.  p = p
22c20 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
22c30 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73 74  r;.  if( regDest
22c40 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73  <0 && p ){.    s
22c50 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
22c60 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
22c70 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70  int i;.    for(p
22c80 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e  Item=p->a, i=p->
22c90 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65  nExpr; i>0; pIte
22ca0 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20  m++, i--){.     
22cb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73   if( pItem->reus
22cc0 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45  able && sqlite3E
22cd0 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
22ce0 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
22cf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22d00 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
22d10 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
22d20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22d30 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
22d40 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
22d50 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
22d60 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
22d70 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
22d80 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
22d90 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
22da0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
22db0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
22dc0 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
22dd0 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
22de0 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
22df0 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
22e00 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
22e10 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22e20 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
22e30 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
22e40 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
22e50 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
22e60 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
22e70 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
22e80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
22e90 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
22ea0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
22eb0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
22ec0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
22ed0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
22ee0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
22ef0 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
22f00 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
22f10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
22f20 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
22f30 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
22f40 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
22f50 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
22f60 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
22f70 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
22f80 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
22f90 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
22fa0 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
22fb0 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
22fc0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
22fd0 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
22fe0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
22ff0 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
23000 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
23010 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
23020 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
23030 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
23040 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
23050 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
23060 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
23070 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
23080 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
23090 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
230a0 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
230b0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
230c0 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
230d0 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
230e0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
230f0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
23100 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
23110 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
23120 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
23130 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
23140 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
23150 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
23160 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
23170 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
23180 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
23190 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
231a0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
231b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
231c0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
231d0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
231e0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
231f0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23200 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
23210 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
23220 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
23230 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
23240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
23250 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23260 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
23270 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
23280 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
23290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
232a0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
232b0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
232c0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
232d0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
232e0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
232f0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
23300 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
23310 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
23320 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
23330 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
23340 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
23350 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23360 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
23370 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
23380 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
23390 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
233a0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
233b0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
233c0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
233d0 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
233e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
233f0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
23400 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
23410 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
23420 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23430 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
23440 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23450 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
23460 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
23470 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
23480 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
23490 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
234a0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
234b0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
234c0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
234d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
234e0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
234f0 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
23500 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
23510 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23520 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
23530 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
23540 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
23550 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
23560 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
23570 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
23580 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
23590 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
235a0 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
235b0 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
235c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
235d0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
235e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
235f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
23600 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
23610 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
23620 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
23630 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23640 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
23650 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23660 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
23670 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
23680 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
23690 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
236a0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
236b0 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
236c0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
236d0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
236e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
236f0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
23700 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
23710 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
23720 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
23730 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
23740 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
23750 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
23760 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
23770 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
23780 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
23790 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
237a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
237b0 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
237c0 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
237d0 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
237e0 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
237f0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
23800 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
23810 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
23820 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
23830 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
23840 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
23850 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
23860 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
23870 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
23880 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
23890 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
238a0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
238b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
238c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
238d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
238e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
238f0 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
23900 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
23910 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
23920 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
23930 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
23940 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
23950 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
23960 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
23970 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
23980 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
23990 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
239a0 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
239b0 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
239c0 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
239d0 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
239e0 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
239f0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
23a00 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
23a10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
23a20 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
23a30 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
23a40 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
23a50 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
23a60 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
23a70 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
23a80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
23a90 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
23aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23ab0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
23ac0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23ad0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
23ae0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
23af0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
23b00 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
23b10 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
23b20 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
23b30 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
23b40 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
23b50 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
23b60 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
23b70 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
23b80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
23b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23ba0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
23bb0 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
23bc0 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
23bd0 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
23be0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23bf0 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
23c00 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
23c10 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
23c20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
23c30 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
23c40 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
23c50 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
23c60 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
23c70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
23c80 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
23c90 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  valuated..**.** 
23ca0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
23cb0 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
23cc0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
23cd0 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
23ce0 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
23cf0 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
23d00 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
23d10 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
23d20 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
23d30 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
23d40 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
23d50 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
23d60 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
23d70 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
23d80 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
23d90 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
23da0 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
23db0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
23dc0 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
23dd0 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
23de0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
23df0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
23e00 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
23e10 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
23e20 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
23e30 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
23e40 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
23e50 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  om there..*/.int
23e60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23e70 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
23e80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
23e90 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23ea0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
23eb0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
23ec0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
23ed0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
23ee0 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
23ef0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
23f00 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
23f10 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
23f20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
23f30 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
23f40 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
23f50 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
23f60 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
23f70 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
23f80 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
23f90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23fa0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
23fb0 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
23fc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
23fd0 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
23fe0 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
23ff0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24000 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
24010 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
24020 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
24030 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
24040 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
24050 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
24060 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
24070 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
24080 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
24090 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
240a0 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
240b0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
240c0 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
240d0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
240e0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
240f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
24100 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
24110 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
24120 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24130 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26  _ECEL_REF)!=0 &&
24140 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78   (j = pItem->u.x
24150 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
24160 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
24170 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
24180 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20  _OMITREF ){.    
24190 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
241a0 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   n--;.      }els
241b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
241c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
241d0 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
241e0 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
241f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
24200 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
24210 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
24220 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )!=0 && sqlite3E
24230 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
24240 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
24250 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24260 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
24270 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
24280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
24290 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
242a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
242b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
242c0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
242d0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
242e0 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
242f0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
24300 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
24310 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
24320 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
24330 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
24340 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
24350 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
24360 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
24370 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
24380 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
24390 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
243a0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
243b0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
243c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
243d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
243e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
243f0 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
24400 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
24410 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
24430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24440 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
24450 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
24460 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
24470 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
24480 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
24490 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
244a0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
244b0 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
244c0 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
244d0 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
244e0 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
244f0 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
24500 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a  tion of x..**.**
24510 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72   The xJumpIf par
24520 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
24530 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a  s details:.**.**
24540 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20      NULL:       
24550 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72              Stor
24560 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  e the boolean re
24570 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74  sult in reg[dest
24580 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  ].**    sqlite3E
24590 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20 20  xprIfTrue:      
245a0 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
245b0 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74  true.**    sqlit
245c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20  e3ExprIfFalse:  
245d0 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
245e0 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54  if false.**.** T
245f0 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61  he jumpIfNull pa
24600 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
24610 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73  ed if xJumpIf is
24620 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
24630 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
24640 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
24650 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
24660 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
24670 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
24680 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
24690 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
246a0 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
246b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
246c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
246d0 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72  p destination or
246e0 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f   storage locatio
246f0 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a  n */.  void (*xJ
24700 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72  ump)(Parse*,Expr
24710 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41  *,int,int), /* A
24720 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f  ction to take */
24730 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
24740 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
24750 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
24760 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
24770 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64  ){. Expr exprAnd
24780 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
24790 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
247a0 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
247b0 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
247c0 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
247d0 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
247e0 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
247f0 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
24800 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
24810 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
24820 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
24830 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
24840 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
24850 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
24860 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28  r */...  memset(
24870 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69  &compLeft, 0, si
24880 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
24890 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74  emset(&compRight
248a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
248b0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78  ));.  memset(&ex
248c0 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66  prAnd, 0, sizeof
248d0 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65  (Expr));..  asse
248e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
248f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
24900 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
24910 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
24920 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
24930 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65  op = TK_AND;.  e
24940 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26  xprAnd.pLeft = &
24950 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  compLeft;.  expr
24960 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
24970 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c  mpRight;.  compL
24980 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
24990 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
249a0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
249b0 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70  pLeft.pRight = p
249c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
249d0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [0].pExpr;.  com
249e0 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
249f0 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  E;.  compRight.p
24a00 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
24a10 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
24a20 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
24a30 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
24a40 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
24a50 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64  (&exprX, exprCod
24a60 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
24a70 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
24a80 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70  1));.  if( xJump
24a90 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50   ){.    xJump(pP
24aa0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
24ab0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
24ac0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24ad0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72  /* Mark the expr
24ae0 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  ession is being 
24af0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
24b00 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
24b10 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20   join.    ** so 
24b20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
24b30 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29  ExprCodeTarget()
24b40 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
24b50 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76  t attempt to mov
24b60 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  e.    ** it into
24b70 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73   the Parse.pCons
24b80 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20  tExpr list.  We 
24b90 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77  should use a new
24ba0 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20   bit for this,. 
24bb0 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74     ** for clarit
24bc0 79 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f 75  y, but we are ou
24bd0 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  t of bits in the
24be0 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
24bf0 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68  d so we.    ** h
24c00 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65  ave to reuse the
24c10 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74   EP_FromJoin bit
24c20 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20  .  Bummer. */.  
24c30 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
24c40 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
24c50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24c60 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24c70 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
24c80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
24c90 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24ca0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
24cb0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
24cc0 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
24cd0 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
24ce0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
24cf0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
24d00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
24d10 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
24d20 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24d30 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24d40 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
24d50 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
24d60 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
24d70 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
24d80 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
24d90 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
24da0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
24db0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24dc0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
24dd0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
24de0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
24df0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
24e00 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24e10 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24e20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
24e30 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
24e40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24e50 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24e60 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
24e70 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
24e80 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
24e90 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24ea0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24eb0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
24ec0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
24ed0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24ee0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24ef0 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
24f00 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
24f10 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24f20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24f30 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
24f40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
24f50 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
24f60 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
24f70 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
24f80 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
24f90 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
24fa0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
24fb0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
24fc0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
24fd0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
24fe0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
24ff0 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
25000 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
25010 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
25020 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
25030 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
25040 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
25050 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
25060 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
25070 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
25080 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
25090 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
250a0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
250b0 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
250c0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
250d0 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
250e0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
250f0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
25100 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
25110 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
25120 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
25130 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
25140 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
25150 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
25160 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
25170 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
25180 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
25190 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
251a0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
251b0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
251c0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
251d0 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
251e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
251f0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
25200 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25210 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
25220 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
25230 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
25240 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
25250 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
25260 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
25270 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
25280 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
25290 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
252a0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
252b0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
252c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
252d0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
252e0 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
252f0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
25300 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
25310 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
25320 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
25330 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
25340 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
25350 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
25360 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
25370 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
25380 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
25390 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
253a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
253b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
253c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
253d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
253e0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
253f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25400 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
25410 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25420 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
25430 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
25440 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
25450 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
25460 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25470 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
25480 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25490 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
254a0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
254b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
254c0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
254d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
254e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
254f0 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
25500 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25510 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
25520 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25540 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
25550 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25560 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25570 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
25580 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25590 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
255a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
255b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
255c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
255d0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
255e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
255f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25600 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
25610 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25620 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25630 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25640 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
25650 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
25660 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
25670 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25680 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
25690 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
256a0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
256b0 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
256c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
256d0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
256e0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
256f0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
25700 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
25710 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
25720 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
25730 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
25740 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
25750 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
25760 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
25770 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
25780 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
25790 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
257a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
257b0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
257c0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
257d0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
257e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
257f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25800 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
25810 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
25820 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
25830 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
25840 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
25850 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
25860 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
25870 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
25880 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
25890 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
258a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
258b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
258c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
258d0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
258e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
258f0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
25900 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
25910 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
25920 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25930 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
25940 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
25950 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
25960 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
25970 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
25980 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
25990 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
259a0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
259b0 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
259c0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
259d0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
259e0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
259f0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
25a00 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
25a10 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
25a20 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
25a30 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
25a40 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
25a50 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
25a60 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
25a70 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
25a80 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
25a90 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
25aa0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25ab0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
25ac0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
25ad0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
25ae0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
25af0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
25b00 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
25b10 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25b20 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
25b30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
25b40 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
25b50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25b60 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
25b70 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
25b80 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25b90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
25ba0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
25bb0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
25bc0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
25bd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
25be0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
25bf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
25c00 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
25c10 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
25c20 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
25c30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
25c40 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
25c50 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
25c60 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
25c70 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
25c80 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
25c90 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
25ca0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
25cb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
25cc0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
25cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ce0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
25cf0 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
25d00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25d10 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
25d20 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
25d30 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
25d40 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
25d50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
25d60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
25d70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
25d80 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
25d90 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
25da0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25db0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
25dc0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
25dd0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
25de0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25df0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
25e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25e10 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
25e20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25e30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
25e40 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
25e50 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
25e60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
25e70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
25e80 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
25e90 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
25ea0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
25eb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25ec0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
25ed0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
25ee0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
25ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
25f00 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
25f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
25f20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
25f30 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
25f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
25f50 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
25f60 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
25f70 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
25f80 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
25f90 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
25fa0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
25fb0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
25fc0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
25fd0 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
25fe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
25ff0 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
26000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
26010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26020 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26030 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
26040 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26050 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
26060 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
26070 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
26080 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
26090 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
260a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
260b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
260c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
260d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
260e0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
260f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
26100 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26110 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26120 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
26130 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26140 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
26150 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
26160 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26170 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
26180 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
26190 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
261a0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
261b0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
261c0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
261d0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
261e0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
261f0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
26200 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
26210 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
26220 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
26230 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
26240 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
26250 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
26260 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
26270 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
26280 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
26290 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
262a0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
262b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
262c0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
262d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
262e0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
262f0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
26300 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26310 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26320 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
26330 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
26340 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
26350 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
26360 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
26370 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
26380 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
26390 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
263a0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
263b0 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
263c0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
263d0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
263e0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
263f0 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
26400 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
26410 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
26420 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
26430 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
26440 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
26450 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
26460 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
26470 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
26480 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
26490 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
264a0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
264b0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
264c0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
264d0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
264e0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
264f0 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
26500 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26520 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
26530 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
26540 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
26550 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
26560 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
26570 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
26580 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
26590 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
265b0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
265c0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
265d0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
265e0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
265f0 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
26600 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
26610 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
26620 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
26630 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
26640 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
26650 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
26660 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
26670 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
26680 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
26690 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
266a0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
266b0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
266c0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
266d0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
266e0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
266f0 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
26700 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
26710 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
26720 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
26730 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
26740 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
26750 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
26760 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
26770 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
26780 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
26790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
267a0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
267b0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
267c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
267d0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
267e0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
267f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
26800 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
26810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
26820 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
26830 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
26840 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
26850 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
26860 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
26870 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
26880 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
26890 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
268a0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
268b0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
268c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
268d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
268e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
268f0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
26900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
26910 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26930 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
26940 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
26950 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26960 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
26970 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
26980 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
26990 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
269a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
269b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
269c0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
269d0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
269e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
269f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
26a00 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26a10 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26a20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26a30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26a40 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
26a50 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
26a60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
26a70 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26a80 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
26a90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26aa0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26ab0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
26ac0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26ae0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
26af0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
26b00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
26b10 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
26b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26b30 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
26b40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26b50 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26b70 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26b80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26b90 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26ba0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26bb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26bc0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
26bd0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
26be0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
26bf0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
26c00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
26c10 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
26c20 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
26c30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
26c40 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
26c50 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
26c60 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
26c70 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
26c80 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
26c90 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
26ca0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
26cb0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
26cc0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
26cd0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
26ce0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
26cf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
26d00 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
26d10 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
26d20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
26d30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26d40 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26d50 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
26d60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
26d70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26d80 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
26d90 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
26da0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26db0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
26dc0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
26dd0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
26de0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
26df0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
26e00 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
26e20 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
26e30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26e40 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
26e50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
26e60 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
26e70 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26e80 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
26e90 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
26ea0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26eb0 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
26ec0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26ed0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
26ee0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
26ef0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26f00 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
26f10 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
26f20 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
26f30 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
26f40 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26f50 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
26f60 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
26f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26f80 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
26f90 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
26fa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
26fb0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
26fc0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
26fd0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
26fe0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
26ff0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27000 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
27010 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27020 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
27030 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
27040 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27050 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
27060 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27070 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
27080 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
27090 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
270a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
270b0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
270c0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
270d0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
270e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
270f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
27100 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
27110 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
27120 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27130 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
27140 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
27150 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
27160 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27170 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27180 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27190 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
271a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
271b0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
271c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
271d0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
271e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
271f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
27200 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
27210 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
27220 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
27230 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27240 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
27250 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27260 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
27270 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27280 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
27290 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
272a0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
272b0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
272c0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
272d0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
272e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
272f0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
27300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27310 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
27320 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27330 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
27340 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
27350 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
27360 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27370 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
27380 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
27390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
273a0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
273b0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
273c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
273d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
273e0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
273f0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
27400 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
27410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27420 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
27430 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
27440 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
27450 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27460 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
27470 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
27480 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
27490 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
274a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
274b0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
274c0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
274d0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
274e0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
274f0 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
27500 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
27510 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
27520 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27530 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
27540 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
27550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27560 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
27570 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
27580 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
27590 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
275a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
275b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
275c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
275d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
275e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
275f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27600 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
27610 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27620 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
27630 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
27640 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
27650 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
27660 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
27670 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
27680 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
27690 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
276a0 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
276b0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
276c0 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
276d0 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
276e0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
276f0 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
27700 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
27710 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
27720 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
27730 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
27740 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
27750 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
27760 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
27770 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
27780 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
27790 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
277a0 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
277b0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
277c0 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
277d0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
277e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
277f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27800 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
27810 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
27820 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
27830 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
27840 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
27850 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
27860 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
27870 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
27880 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
27890 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
278a0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
278b0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
278c0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
278d0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
278e0 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
278f0 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
27900 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
27910 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
27920 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
27930 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
27940 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
27950 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
27960 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
27970 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
27980 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
27990 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
279a0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
279b0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
279c0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
279d0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
279e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
279f0 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
27a00 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
27a10 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
27a20 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
27a30 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
27a40 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
27a50 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
27a60 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
27a70 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
27a80 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
27a90 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
27aa0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
27ab0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
27ac0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
27ad0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
27ae0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
27af0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
27b00 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
27b10 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
27b20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
27b30 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
27b40 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
27b50 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
27b60 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
27b70 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
27b80 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
27b90 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
27ba0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
27bb0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
27bc0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
27bd0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
27be0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
27bf0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
27c00 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
27c10 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
27c20 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
27c30 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
27c40 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
27c50 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
27c60 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
27c70 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
27c80 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
27c90 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
27ca0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
27cb0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
27cc0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
27cd0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
27ce0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
27cf0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
27d00 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
27d10 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
27d20 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
27d30 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
27d40 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
27d50 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
27d60 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
27d70 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
27d80 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
27d90 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
27da0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
27db0 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
27dc0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
27dd0 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
27de0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
27df0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
27e00 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
27e10 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
27e20 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
27e30 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
27e40 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
27e50 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
27e60 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
27e70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27e80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
27e90 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
27ea0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
27eb0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
27ec0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
27ed0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
27ee0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
27ef0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
27f00 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
27f10 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
27f20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
27f30 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
27f40 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
27f50 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
27f60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27f70 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
27f80 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
27f90 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
27fa0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
27fb0 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
27fc0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
27fd0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
27fe0 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
27ff0 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
28000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
28010 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
28020 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
28030 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
28040 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
28050 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
28060 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
28070 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
28080 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
28090 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
280a0 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
280b0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
280c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
280d0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
280e0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
280f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
28100 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
28110 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
28120 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
28130 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
28140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28150 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
28160 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
28170 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
28180 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
28190 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
281a0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
281b0 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
281c0 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
281d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
281e0 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
281f0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
28200 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
28210 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
28220 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
28230 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
28240 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
28250 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
28260 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
28270 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
28280 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
28290 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
282a0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
282b0 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
282c0 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
282d0 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
282e0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
282f0 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
28300 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
28310 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
28320 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
28330 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
28340 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
28350 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
28360 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
28370 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
28380 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28390 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
283a0 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
283b0 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
283c0 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
283d0 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
283e0 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
283f0 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
28400 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28410 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
28420 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
28430 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
28440 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
28450 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
28460 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
28470 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
28480 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
28490 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
284a0 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
284b0 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
284c0 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
284d0 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
284e0 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
284f0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
28500 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
28510 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
28520 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
28530 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
28540 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
28550 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
28560 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
28570 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
28580 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
28590 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
285a0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
285b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
285c0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
285d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
285e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
285f0 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
28600 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
28610 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
28620 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
28630 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
28640 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
28650 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
28660 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
28670 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28680 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28690 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
286a0 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65  prCompare() exce
286b0 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  pt COLLATE opera
286c0 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d  tors at the top-
286d0 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e  level.** are ign
286e0 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
286f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
28700 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78  kip(Expr *pA, Ex
28710 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
28720 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
28730 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 0a  te3ExprCompare(.
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
28750 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
28760 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
28770 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28780 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
28790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
287a0 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
287b0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
287c0 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
287d0 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
287e0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
287f0 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
28800 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
28810 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
28820 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
28830 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
28840 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
28850 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
28860 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
28870 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
28880 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
28890 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
288a0 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
288b0 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
288c0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
288d0 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
288e0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
288f0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
28900 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
28910 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
28920 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
28930 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
28940 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
28950 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
28960 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
28970 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
28980 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
28990 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
289a0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
289b0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
289c0 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
289d0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
289e0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
289f0 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
28a00 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
28a10 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
28a20 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
28a30 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
28a40 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
28a50 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
28a60 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
28a70 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
28a80 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
28a90 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
28aa0 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
28ab0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
28ac0 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
28ad0 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
28ae0 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
28af0 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
28b00 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
28b10 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
28b20 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
28b30 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
28b40 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
28b50 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
28b60 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45  xpr(Expr *pE1, E
28b70 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
28b80 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
28b90 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
28ba0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
28bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
28bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
28bd0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
28be0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
28bf0 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
28c00 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
28c20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
28c30 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d  esExpr(pE1, pE2-
28c40 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
28c50 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
28c60 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
28c70 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
28c80 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
28c90 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
28ca0 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
28cb0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
28cc0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
28cd0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
28ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
28cf0 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
28d00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28d10 78 70 72 43 6f 6d 70 61 72 65 28 70 58 2c 20 70  xprCompare(pX, p
28d20 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
28d30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
28d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
28d50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
28d60 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
28d70 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
28d80 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
28d90 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
28da0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   determine if an
28db0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
28dc0 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20  be evaluated by 
28dd0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
28de0 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20  .** index only, 
28df0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
28e00 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  o do a search fo
28e10 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
28e20 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74  ing.** table ent
28e30 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65  ry.  The IdxCove
28e40 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20  r.pIdx field is 
28e50 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43  the index.  IdxC
28e60 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20  over.iCur.** is 
28e70 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  the cursor for t
28e80 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  he table..*/.str
28e90 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20  uct IdxCover {. 
28ea0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
28eb0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
28ec0 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20  o be tested for 
28ed0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e  coverage */.  in
28ee0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f  t iCur;        /
28ef0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
28f00 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f  for the table co
28f10 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
28f20 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a  he index */.};..
28f30 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
28f40 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
28f50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
28f60 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a  lumns in table .
28f70 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
28f80 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61  dxCover->iCur ca
28f90 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75  n be satisfied u
28fa0 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a  sing the index.*
28fb0 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
28fc0 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f  xCover->pIdx..*/
28fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
28fe0 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20  IdxCover(Walker 
28ff0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
29000 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
29010 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
29020 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
29030 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
29040 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
29050 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ur.   && sqlite3
29060 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57  ColumnOfIndex(pW
29070 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
29080 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d  er->pIdx, pExpr-
29090 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b  >iColumn)<0.  ){
290a0 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
290b0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ode = 1;.    ret
290c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
290d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
290e0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
290f0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
29100 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e  an index pIdx on
29110 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
29120 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  or iCur contains
29130 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70   will.** the exp
29140 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
29150 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
29160 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f  he index does co
29170 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ver the.** expre
29180 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20  ssion and false 
29190 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70  if the pExpr exp
291a0 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63  ression referenc
291b0 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  es table columns
291c0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74  .** that are not
291d0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e   found in the in
291e0 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
291f0 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e  An index coverin
29200 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
29210 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
29220 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
29230 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73  .** evaluated us
29240 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64  ing only the ind
29250 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68  ex and without h
29260 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20  aving to lookup 
29270 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
29280 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79  ding table entry
29290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
292a0 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
292b0 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ex(.  Expr *pExp
292c0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
292d0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
292e0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ted */.  int iCu
292f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
29300 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
29310 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  r for the corres
29320 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f  ponding table */
29330 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
29340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
29350 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62  dex that might b
29360 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  e used for cover
29370 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  age */.){.  Walk
29380 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49  er w;.  struct I
29390 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20  dxCover xcov;.  
293a0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
293b0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76  zeof(w));.  xcov
293c0 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
293d0 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78  xcov.pIdx = pIdx
293e0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
293f0 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76  ack = exprIdxCov
29400 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f  er;.  w.u.pIdxCo
29410 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73  ver = &xcov;.  s
29420 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
29430 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74  w, pExpr);.  ret
29440 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a  urn !w.eCode;.}.
29450 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
29460 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
29470 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
29480 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
29490 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
294a0 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
294b0 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
294c0 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
294d0 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
294e0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
294f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
29500 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
29510 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
29520 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
29530 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
29540 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
29550 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
29560 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
29570 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
29580 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
29590 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
295a0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
295b0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
295c0 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
295d0 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
295e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
295f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
29600 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
29610 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
29620 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
29630 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
29640 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
29650 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
29660 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
29670 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
29680 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
29690 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
296a0 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
296b0 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
296c0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
296d0 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
296e0 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
296f0 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
29700 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
29710 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
29720 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
29730 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
29740 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
29750 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
29760 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
29770 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
29780 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
29790 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
297a0 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
297b0 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
297c0 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
297d0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
297e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
297f0 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
29800 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
29810 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
29820 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
29830 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
29840 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
29850 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
29860 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
29870 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53     int nSrc = pS
29880 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20  rc ? pSrc->nSrc 
29890 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
298a0 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  ; i<nSrc; i++){.
298b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
298c0 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
298d0 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
298e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
298f0 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20  f( i<nSrc ){.   
29900 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20     p->nThis++;. 
29910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29920 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20  p->nOther++;.   
29930 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
29940 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
29950 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
29960 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61   if any of the a
29970 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
29980 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72  pExpr Function r
29990 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63  eference.** pSrc
299a0 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72  List.  Return tr
299b0 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20  ue if they do.  
299c0 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65  Also return true
299d0 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
299e0 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d  .** has no argum
299f0 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79  ents or has only
29a00 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
29a10 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nts.  Return fal
29a20 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72  se if pExpr.** r
29a30 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e  eferences column
29a40 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e  s but not column
29a50 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e  s of tables foun
29a60 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
29a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e  /.int sqlite3Fun
29a80 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
29a90 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72  (Expr *pExpr, Sr
29aa0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29  cList *pSrcList)
29ab0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
29ac0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
29ad0 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  cnt;.  assert( p
29ae0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
29af0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d  _FUNCTION );.  m
29b00 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
29b10 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
29b20 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
29b30 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75  rSrcCount;.  w.u
29b40 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
29b50 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
29b60 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
29b70 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
29b80 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
29b90 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
29ba0 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
29bb0 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
29bc0 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
29bd0 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
29be0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
29bf0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
29c00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
29c10 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
29c20 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
29c30 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
29c40 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
29c50 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
29c60 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
29c70 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
29c80 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
29c90 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
29ca0 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
29cb0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
29cc0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
29cd0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
29ce0 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
29cf0 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
29d00 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
29d10 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
29d20 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
29d30 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
29d40 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
29d50 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
29d60 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
29d70 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
29d80 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
29d90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
29da0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
29db0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
29dc0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
29dd0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
29de0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
29df0 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
29e00 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
29e10 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
29e20 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
29e30 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
29e40 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
29e50 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
29e60 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
29e70 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
29e80 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
29e90 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
29ea0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
29eb0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
29ec0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
29ed0 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
29ee0 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
29ef0 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
29f00 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
29f10 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
29f20 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
29f30 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
29f40 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
29f50 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
29f60 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
29f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
29f80 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
29f90 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
29fa0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
29fb0 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
29fc0 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
29fd0 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
29fe0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
29ff0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
2a000 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
2a010 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
2a020 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
2a030 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
2a040 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
2a050 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
2a060 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
2a070 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
2a080 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
2a090 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2a0a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
2a0b0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
2a0c0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2a0d0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
2a0e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2a0f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
2a100 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
2a110 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2a120 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
2a130 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2a140 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
2a150 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
2a160 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
2a170 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
2a180 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2a190 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
2a1a0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
2a1b0 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
2a1c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
2a1d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2a1e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2a1f0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
2a200 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2a210 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2a220 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2a230 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2a240 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2a250 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2a260 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
2a270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a280 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2a290 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
2a2a0 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
2a2b0 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
2a2c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
2a2d0 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
2a2e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2a2f0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
2a300 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
2a310 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
2a320 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
2a330 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
2a340 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2a350 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
2a360 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
2a370 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
2a380 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
2a390 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2a3a0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
2a3b0 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
2a3c0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
2a3d0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
2a3e0 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
2a3f0 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
2a400 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2a410 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
2a420 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2a430 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2a440 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2a450 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2a460 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2a470 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a480 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2a490 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a4a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
2a4b0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
2a4c0 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
2a4d0 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
2a4e0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
2a4f0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
2a500 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
2a510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a520 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
2a530 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
2a540 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a550 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  >pTab = pExpr->p
2a560 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
2a570 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20     pCol->iTable 
2a580 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
2a590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a5a0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  Col->iColumn = p
2a5b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2a5d0 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
2a5e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a5f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2a600 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31  orterColumn = -1
2a610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a620 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45  pCol->pExpr = pE
2a630 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2a640 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d     if( pAggInfo-
2a650 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2a670 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   j, n;.         
2a680 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
2a690 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d  *pGB = pAggInfo-
2a6a0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
2a6b0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2a6c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2a6d0 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b  *pTerm = pGB->a;
2a6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6f0 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b   n = pGB->nExpr;
2a700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a710 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a   for(j=0; j<n; j
2a720 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d  Expr *pE = pTerm
2a750 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
2a760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2a770 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  E->op==TK_COLUMN
2a780 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d   && pE->iTable==
2a790 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2a7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a7b0 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
2a7c0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
2a7d0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2a7e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2a7f0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2a800 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
2a810 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2a840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a850 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a860 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
2a870 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  terColumn<0 ){. 
2a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a890 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2a8a0 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  mn = pAggInfo->n
2a8b0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b  SortingColumn++;
2a8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2a8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a8f0 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e  ere is now an en
2a900 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e  try for pExpr in
2a910 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2a920 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20  ] (either.      
2a930 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
2a940 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65   it was there be
2a950 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20  fore or because 
2a960 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20  we just created 
2a970 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  it)..           
2a980 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   ** Convert the 
2a990 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b  pExpr to be a TK
2a9a0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65  _AGG_COLUMN refe
2a9b0 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20  rring to that.  
2a9c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67            ** pAg
2a9d0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e  gInfo->aCol[] en
2a9e0 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
2a9f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2aa00 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2aa10 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2aa20 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2aa30 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
2aa40 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2aa60 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
2aa70 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
2aa80 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2aa90 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
2aaa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aab0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
2aac0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2aad0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
2aae0 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
2aaf0 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
2ab00 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
2ab10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2ab20 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
2ab30 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
2ab40 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
2ab50 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
2ab60 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e  gs & NC_InAggFun
2ab70 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  c)==0.       && 
2ab80 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2ab90 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32  epth==pExpr->op2
2aba0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2abb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2abc0 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
2abd0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
2abe0 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
2abf0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
2ac00 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
2ac10 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
2ac20 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
2ac30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ac40 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2ac50 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
2ac60 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
2ac70 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2ac80 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2ac90 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2aca0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2acb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2acc0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
2acd0 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29   pExpr, -1)==0 )
2ace0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
2acf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2ad00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ad10 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
2ad20 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
2ad30 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
2ad40 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
2ad50 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
2ad60 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
2ad70 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
2ad80 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
2ad90 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
2ada0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
2adb0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
2adc0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
2add0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2ade0 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
2adf0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2ae00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2ae10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
2ae20 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2ae30 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
2ae40 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
2ae50 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
2ae60 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
2ae70 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2ae80 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
2ae90 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2aea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2aeb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2aec0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2aed0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
2aee0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2aef0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
2af00 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
2af10 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
2af20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2af30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20  ->u.zToken, .   
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
2af60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2af70 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
2af80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2af90 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
2afa0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
2afb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2afc0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2afd0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2afe0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2aff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b000 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2b010 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2b020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b040 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2b050 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
2b060 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
2b070 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2b080 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
2b090 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2b0a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2b0b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2b0c0 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2b0d0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
2b0e0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2b0f0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2b100 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45  uce);.        pE
2b110 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2b120 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  )i;.        pExp
2b130 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2b140 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2b150 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2b180 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
2b190 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2b1a0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2b1b0 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
2b1c0 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
2b1d0 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
2b1e0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2b1f0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2b200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b210 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e  R(pWalker);.  UN
2b220 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b230 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
2b240 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2b250 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
2b260 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2b270 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
2b280 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
2b290 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
2b2a0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2b2b0 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
2b2c0 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65   to AggInfo obje
2b2d0 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67  ct that pNC->pAg
2b2e0 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20  gInfo.** points 
2b2f0 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  to.  Additional 
2b300 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65  entries are made
2b310 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   on the AggInfo 
2b320 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63  object as.** nec
2b330 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
2b340 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2b350 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2b360 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
2b370 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
2b380 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
2b390 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
2b3a0 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
2b3b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2b3c0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
2b3d0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2b3e0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2b3f0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
2b400 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
2b410 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
2b420 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2b430 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
2b440 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2b450 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2b460 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
2b470 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
2b480 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
2b490 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
2b4a0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2b4b0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
2b4c0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
2b4d0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2b4e0 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
2b4f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2b500 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
2b510 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
2b520 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2b530 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
2b540 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
2b550 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
2b560 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
2b570 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2b580 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
2b590 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2b5a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
2b5b0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
2b5c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2b5d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2b5e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
2b5f0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
2b600 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2b610 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
2b620 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2b630 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2b640 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
2b650 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
2b660 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2b670 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
2b680 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
2b690 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
2b6a0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
2b6b0 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
2b6c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2b6d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2b6e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
2b6f0 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
2b700 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
2b710 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
2b720 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
2b730 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
2b740 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
2b750 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2b760 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
2b770 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
2b780 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
2b790 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
2b7a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
2b7b0 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
2b7c0 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
2b7d0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2b7e0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65  , then.** the de
2b7f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
2b800 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
2b810 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
2b820 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
2b830 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
2b840 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
2b850 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2b860 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
2b870 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2b880 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
2b890 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
2b8a0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
2b8b0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
2b8c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2b8d0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
2b8e0 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
2b8f0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
2b900 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
2b910 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
2b920 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
2b930 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
2b940 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
2b950 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
2b960 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
2b970 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
2b980 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
2b990 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
2b9a0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
2b9b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2b9c0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
2b9d0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
2b9e0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
2b9f0 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
2ba00 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2ba10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2ba20 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
2ba30 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  i, n;.  if( nReg
2ba40 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c  ==1 ) return sql
2ba50 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2ba60 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50  Parse);.  i = pP
2ba70 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
2ba80 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
2ba90 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
2baa0 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
2bab0 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
2bac0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
2bad0 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
2bae0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2baf0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
2bb00 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2bb10 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
2bb20 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
2bb30 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
2bb40 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2bb50 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
2bb60 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
2bb70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2bb80 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2bb90 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
2bba0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28  int nReg){.  if(
2bbb0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
2bbc0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2bbd0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
2bbe0 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  eg);.    return;
2bbf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2bc00 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
2bc10 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
2bc20 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
2bc30 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2bc40 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
2bc50 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
2bc60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2bc70 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
2bc80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
2bc90 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
2bca0 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
2bcb0 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
2bcc0 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
2bcd0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2bce0 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
2bcf0 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
2bd00 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
2bd10 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
2bd20 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  geReg = 0;.}../*
2bd30 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61  .** Validate tha
2bd40 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72  t no temporary r
2bd50 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69  egister falls wi
2bd60 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  thin the range o
2bd70 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61  f.** iFirst..iLa
2bd80 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20  st, inclusive.  
2bd90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2bda0 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77  only call from w
2bdb0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a  ithin assert().*
2bdc0 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  * statements..*/
2bdd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2bde0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
2bdf0 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50  NoTempsInRange(P
2be00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2be10 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c  t iFirst, int iL
2be20 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ast){.  int i;. 
2be30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61   if( pParse->nRa
2be40 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70  ngeReg>0.   && p
2be50 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2be60 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  +pParse->nRangeR
2be70 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20 70  eg<iLast.   && p
2be80 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2be90 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20 20  >=iFirst.  ){.  
2bea0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2beb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2bec0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20  arse->nTempReg; 
2bed0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
2bee0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2bef0 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61  ]>=iFirst && pPa
2bf00 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2bf10 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
2bf20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2bf30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2bf40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2bf50 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.